Расшифровка Java выдает исключение

Вот мой метод шифрования (значение является входным параметром):

 byte key_bytes[] = "12345678".getBytes();
 SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // Yes, I know I shouldn't use DES
 cipher.init(Cipher.ENCRYPT_MODE, _keyspec);

 byte[] utf8 = value.getBytes("UTF8");
 byte[] enc = cipher.doFinal(utf8);   // Encrypt

 String encrypted = new String(new Base64().encode(enc));

 return URLEncoder.encode(encrypted, "UTF-8");

Вот мой метод расшифровки (значение является входным параметром):

byte key_bytes[] = "12345678".getBytes();
SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
Cipher dcipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, _keyspec);

byte[] dec = new Base64().decode(value);
byte[] utf8 = dcipher.doFinal(dec);  // Decrypt, throws exception
return new String(utf8, "UTF8");

И я получаю исключение:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

Я читал разные темы, так что я понял, что это исключение возникает, когда нет заполнения и есть другой режим шифрования. Итак, что случилось?


person John Smith    schedule 17.07.2014    source источник
comment
Где твой URLDecoder? И это в основном происходит, если ваш зашифрованный текст больше не кратен размеру блока (8 для DES).   -  person Maarten Bodewes    schedule 17.07.2014
comment
Обратите внимание, что использование DES небезопасно, ECB небезопасно, и отправка зашифрованного текста без тега аутентификации (HMAC) по сети также небезопасна.   -  person Maarten Bodewes    schedule 18.07.2014
comment
Я упомянул, что DES небезопасен, ECB небезопасен, но требования есть требования.   -  person John Smith    schedule 18.07.2014
comment
@JohnSmith Еще раз проверьте мой обновленный ответ и комментарий.   -  person Wundwin Born    schedule 18.07.2014
comment
@owlstead, можете ли вы привести пример использования HMAC с таким типом шифрования?   -  person John Smith    schedule 18.07.2014
comment
Что ж, вы используете — желательно другой — ключ для вычисления HMAC, затем вычисляете HMAC по зашифрованному тексту и — если используется — IV и другие настраиваемые параметры шифрования, которые отправляются. Затем вы проверяете HMAC перед расшифровкой. Это действительно так.   -  person Maarten Bodewes    schedule 18.07.2014
comment
@owlstead спасибо за совет, буду иметь в виду   -  person John Smith    schedule 23.07.2014


Ответы (2)


Как говорит стек исключений, длина должна быть кратна 8.

Итак, длина 8, 16, 24,... допустима для байтов ключа.

Попробуйте длину 8 (12345678)

byte key_bytes[] = "12345678".getBytes();

Если ошибка сохраняется, вы можете следовать этому ответить

Обновлено

Если вы хотите использовать URLDecoder, попробуйте использовать этот код в своем методе расшифровки,

String decryptd = URLDecoder.decode(value, "UTF-8");
byte[] dec = new Base64().decode(decryptd);
byte[] utf8 = dcipher.doFinal(dec);  
return new String(utf8, "UTF-8");
person Wundwin Born    schedule 17.07.2014
comment
извините, я отредактировал вопрос, в источнике они имеют длину 8 символов - person John Smith; 17.07.2014
comment
@JohnSmith Возможно, вам придется перейти по ссылке в обновленном ответе. - person Wundwin Born; 17.07.2014
comment
Я не вижу никакой разницы, только стандарт шифрования и кодировка/декодирование UTF-8, используемые в моем коде. - person John Smith; 18.07.2014
comment
@JohnSmith Проблема в вашем методе шифрования, если вы вернете строку encrypted вместо return URLEncoder.encode(encrypted, "UTF-8");, все будет в порядке. - person Wundwin Born; 18.07.2014
comment
да, помогло, спс! - person John Smith; 18.07.2014

В вашем методе расшифровки отсутствует URLDecoder. Обратите внимание, что если строка была скомпрометирована каким-либо другим способом и ее длина больше не кратна размеру блока, вы получите это исключение как для режимов работы ECB, так и для CBC.

person Maarten Bodewes    schedule 17.07.2014
comment
Я использую кодировщик Apache Base64, URL-адрес декодируется выше, другим методом, поэтому значение на входе уже декодировано - person John Smith; 17.07.2014
comment
В моей системе работает иначе. Проверьте, является ли полученная строка отправленной строкой! Обратите внимание, что именно поэтому вы должны создать SSCCE! - person Maarten Bodewes; 17.07.2014
comment
строка, которую я получаю на выходе метода шифрования, равна строке, которая дается на вход при расшифровке - person John Smith; 18.07.2014
comment
Не могли бы вы показать нам пример входной строки, используемой для расшифровки, которая не работает с этим исключением? Желательно отредактировать его в ответ и ответить, что вы сделали это здесь. - person Maarten Bodewes; 18.07.2014