Java-эквивалент для расшифровки openssl blowfish - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть файл двоичных данных в кодировке base64, предоставленных другой системой, которые я могу успешно расшифровать с помощью следующей командной строки openssl.

openssl enc -d -blowfish -a -in base64d_encrypted_content.txt

(К сожалению, все, что я знаю о применяемом шифровании)

В Java, как я могу выполнить такое же дешифрование?

В настоящее время у меня есть ...

BufferedReader reader = new BufferedReader(new InputStreamReader(content.getInputStream()));
StringBuffer buffer = new StringBuffer();
String line = reader.readLine();
while (line != null) {
    buffer.append(line + "\n");
    line = reader.readLine();
}
reader.close();

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(buffer.toString());

SecretKeySpec blowfishKey = new SecretKeySpec(password, "Blowfish");
Cipher blowfishCipher = Cipher.getInstance("Blowfish");
blowfishCipher.init(Cipher.DECRYPT_MODE, blowfishKey);
byte[] decryptedBytes = blowfishCipher.doFinal(decodedBytes);

но я получаю следующее исключение ...

Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

После долгих поисков я наткнулся на not-Пока-commons-ssl , который, кажется, предоставляет метод, реплицирующий командную строку openssl в Java ...

byte[] decrypted = OpenSSL.decrypt("blowfish", password.toCharArray(), base64EncryptedBytes);

Когда у меня будет время, я покопаюсь в их коде и выясню, что именно делается. В то же время это выглядит так: OpenSSL.java - это место для старта.

1 голос
/ 08 декабря 2011

У вас ошибка заполнения.Какой режим заполнения использовался для шифрования исходного зашифрованного текста?Вам нужно установить код Java, чтобы он ожидал такой формы заполнения.

Если вы не знаете, попробуйте каждый из допустимых отступов по очереди.Начните с PKCS5 / PKCS7, поскольку он, вероятно, является наиболее распространенным.

ETA

Ваша проблема, вероятно, заключается не только в заполнении.Вы должны быть уверены, все элементы одинаковы с обеих сторон.

  • Ключ должен быть байтовым идентичным.
  • Режим должен бытьто же самое: CBC, CTR или ECB (тьфу).
  • IV должен быть одинаковым, побайтный.
  • Заполнение должно быть таким же.

Не полагайтесь на значения по умолчанию, установите их все явно.С ключом и IV не проверяйте символы, проверяйте байты.

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