Что является эквивалентом Java JCE для этой функции шифрования C OpenSSL? - PullRequest
2 голосов
/ 08 февраля 2010

Я пишу Java-реализацию приложения, изначально написанного на C. Я не могу изменить версию C, и версия Java должна делиться зашифрованными данными с версией C.

Вот соответствующая часть кода шифрования C:

makekeys(password,&key1,&key2); /* turns password into two 8 byte arrays */
fill_iv(iv); /* bytes 8 bytes of randomness into iv */
des_key_sched(&key1,ks1);
des_key_sched(&key2,ks2);
des_ede2_ofb64_encrypt(hashed,ctext,hashedlen,ks1,ks2,
                       &iv,&num);

Я вижу, что эквивалент JCE - это что-то вроде:

SecretKey key = new SecretKeySpec(keyBytes, "DESede");
IvParameterSpec iv = new IvParameterSpec(new byte[8]);
Cipher cipher = Cipher.getInstance("DESede/?????/?????"); // transformation spec?
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] cipherTextBytes = cipher.doFinal(plaintext);

Вопросы:

  • Код C принимает два ключа, JCE - один. Как мне с этим смириться? Просто добавить два в один массив? В каком порядке?
  • Какая спецификация преобразования (если есть!) Эквивалентна описанию OpenSSL des_ede2_ofb64_encrypt? Как бы я узнал, кроме как спросить незнакомцев в Интернете? ;)

1 Ответ

2 голосов
/ 08 февраля 2010

Отвечая на ваш последний вопрос, вы узнаете об этом, прочитав документацию по конкретным алгоритмам. Документы Sun обычно предполагают, что вы уже знакомы с предметом. В этом случае вы должны знать, что: тройной DES - это применение трех экземпляров DES ECB с независимым ключом в последовательности; что наиболее распространенным способом для этого является то, что называется DES ede, что означает, что 1-й и 3-й экземпляры DES выполняются в направлении шифрования, а 2-й экземпляр DES запускается в направлении дешифрования; что ede3 три означает, что каждый экземпляр DES имеет ключ независимо, а ede2 означает, что 1-й и 3-й экземпляры используют один и тот же ключ; что OFB64 означает 64-битный режим обратной связи.

Вы должны получить тот же результат с getInstance ("DESede / OFB64 / NoPadding"), и сделав ключ 1 первыми 8 байтами ключа DESede, ключ 2 вторым и ключ 1 третьим.

...