2016-03-24 2 views
0

Я использовал следующий код для шифрования данных. Мой вход 16 байт, а ключ - 16 байт, но вывод, который я получаю (зашифрованные данные), составляет 32 байта. Зачем?Почему шифрование AES 128 расширяет данные?

public static byte[] encrypt(byte[] plainText, byte[] key) { 
try { 
    byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16); 
    SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(plainText); 
    // String encryptedString = Base64.getEncoder().encodeToString(cipherText); 
    return cipherText; 

В чем причина? Добавляет ли AES некоторые данные?

+0

Возможный дубликат [Где разместить информацию о длине заполнения?] (Http://stackoverflow.com/questions/26930911/where-to-put-information-about-padding-length) –

+0

Согласно стандарту, AES имеет размер блока - 128 бит. Другими словами, другие размеры блоков нестандартны. Вы цитируете не раскрывает, что делает функция разработчика программного обеспечения «cipher.doFinal()». Итак, ИМХО, лучше попросить разработчика вашего программного обеспечения объяснить феномен, который вы наблюдали. –

+0

Общие рекомендации: ** Всегда используйте полностью исписанную строку Cipher. ** 'Cipher.getInstance (« AES »);' может приводить к разным шифрам в зависимости от поставщика безопасности по умолчанию. Это, скорее всего, приводит к '' AES/ECB/PKCS5Padding'', но это необязательно. Если он изменится, вы потеряете совместимость между разными JVM. –

ответ

2

Вы получаете Cipher объект через Cipher.getInstance(transformation) метод, при котором преобразование имеет вид:

"algorithm/mode/padding" or 
"algorithm" 

Когда вы сделаете это поиски реализации через список криптографических провайдеров в системе и определить, есть ли реализация поддерживает эту , Если вы не укажете режим и отступы, то до криптопровайдера выберете, какой режим по умолчанию и отступы использовать.

В соответствии с this, например, SunJCE по умолчанию использует ECB в качестве режима по умолчанию и PKCS5Padding.

Как PKCS5Padding всегда добавляет хотя бы один байт, он подталкивает ваши 16 байтов к пределу блока и создает необходимость в двух блоках.

Смежные вопросы