Java Crypto API, эквивалентный OpenSSL Ruby (через библиотеку encrypted_strings) - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь расшифровать зашифрованное сообщение, зашифрованное в веб-приложении Ruby, с помощью библиотеки RubyGem encrypted_strings.

Код клиента шифрования выглядит следующим образом:

cipher = EncryptedStrings::SymmetricCipher.new(:passphrase => "abcdefgh"*2)
cipher.encrypt("howdy")
=> "jEUQrH58Ulk=\n" 

Алгоритм симметричного шифра по умолчанию выглядит как DES-EDE3-CBC (хотя документация для RubyGem не совпадает, но я пойду с тем, что говорит код). Поэтому на стороне Java я попробовал следующее, которое нашел в Интернете в качестве примера использования DES-EDE3-CBC API криптографии Java:

import javax.crypto.spec.DESedeKeySpec
import javax.crypto.spec.IvParameterSpec
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory


...
DESedeKeySpec k;
Cipher c;

...
k = new DESedeKeySpec("abcdefghabcdefgh".getBytes());
c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, k);
decrypted = c.doFinal("jEUQrH58Ulk=\n".getBytes());

Когда я делаю это на стороне Java, я получаю следующее:

Wrong key size 

Я также пытался использовать Java Crypto API с вектором инициализации, но не знал, что я должен установить байты, так как я не делаю это на стороне Ruby через библиотеку encrypted_strings, и она, кажется, установлена ​​в C взаимодействие кода с OpenSSL.

Любые указатели приветствуются.

Я пользуюсь провайдером JCA. Я также попробовал DES / ECB / PKCS5Padding (что соответствует задокументированному алгоритму по умолчанию в документации по RubyGems, хотя код, по-видимому, ссылается на ранее упомянутый алгоритм DES-EDE3-CBC).

Я попытался прочитать вокруг крипто-API Java, но все документы, похоже, имеют одинаковые примеры кода и не очень много новых подсказок. Мои источники включают в себя:

1 Ответ

0 голосов
/ 20 марта 2012

Выложу как ответ. С DESede вы можете использовать 192-битные ключи DES ABC или 128-битные ключи ABA. Многие версии Java принимают только 192-битные (24-байтовые) ключи DES ABC. В ключах DES ABA первый и последний ключи операции шифрования, дешифрования, шифрования (EDE) совпадают; другими словами, это то же самое, что DESede с ABC, где C = A.

Таким образом, чтобы создать такой ключ, вы можете скопировать первые 8 байтов (в вашем случае 8 символов ASCII - используя символы непосредственно как ключ неверный) вашего ключа и объединить их в конце. Это приведет к "abcdefghabcdefghabcdefgh".getBytes("ASCII"). Обратите внимание, что вы всегда должны указывать кодировку символов, так как платформа может также использовать UTF-16 в качестве кодировки символов по умолчанию, в результате чего ключ удваивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...