#java #encryption #bouncycastle
#java #шифрование #bouncycastle
Вопрос:
Я пытаюсь преобразовать следующий код из C # в Java, но получаю разные результирующие значения ключей. Вот мои коды:
C#:
plainText = "Hello World";
passPhrase = "IhDyHz6bgQyS0Ff1/1s=";
saltValue = "0A0Qvv09OXd3GsYHVrA=";
hashAlgorithm = "SHA1";
passwordIterations = 3;
initVector = "GjrlRZ6INgNckBqv";
keySize = 256;
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
PasswordDeriveBytes password = new PasswordDeriveBytes(
passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);
byte[] keyBytes = password.GetBytes(keySize / 8);
Java
byte[] password = PassPhrase.getBytes("ASCII");
byte[] salt = PKCS5S1ParametersGenerator.PKCS5PasswordToBytes(SaltValue.toCharArray());
PKCS5S1ParametersGenerator generator = new PasswordDeriveBytes(new SHA1Digest());
generator.init(password, salt, PasswordIterations);
byte[] key = ((KeyParameter)generator.generateDerivedParameters(32)).getKey();
Проблема в том, что я получаю разные ключи даже с одинаковыми параметрами, указанными в обоих кодах: (совпадают только первые 4 байта)
ПРИМЕЧАНИЕ: эти значения были преобразованы в Base64:
C #: GWR/loJAuuiPvP0cuGGCVXErz16HjOZ7yQkCCHfBux4= Java: GWR/4oCT
Если я продолжу играть с номером, предоставленным для generateDerivedParameters (32), это только даст мне больше байтов, но все равно не соответствует результату в .Net.
Я не могу изменить .Чистый код, поэтому, пожалуйста, любое предложение должно быть сделано на стороне Java.
Заранее спасибо.
Ответ №1:
generateDerivedParameters
Метод говорит: «KeySize — это размер ключа, который мы хотим (в битах)». Итак, вы должны использовать generateDerivedParameters(32 * 8)
Комментарии:
1. Спасибо за разъяснение, но ключ C # по-прежнему не соответствует, вот результат: GWR/4oCT4oCaQMK6w6jvv73CvMO9HMK4YeKAmlVxK8OPXuKAocWSw6Z7w4kJAgh3w4HCux4=
2. Похоже, что в другом стандарте (sic!) Base64 используется другой алфавит. Не могли бы вы сравнить байты, двоичные значения, чтобы проверить, совпадают ли они?
3. Боже мой, вы совершенно правы, хотя я много тестировал преобразование метода Base64 Java в его аналог в C #, на этот раз я был глуп, глядя на байты, они на самом деле одинаковы.