Код шифрования C # перенесен на Java

#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 #, на этот раз я был глуп, глядя на байты, они на самом деле одинаковы.