Java AES без заполнения

Каковы самые простые способы шифрования 9X_encrypted и дешифрования 16-байтового массива AES 9X_core-java без автоматического заполнения? Я нашел 9X_jre решения, в которых используются внешние 9X_pad библиотеки, но по возможности хочу этого 9X_decryption избежать.

Мой текущий код

SecretKeySpec skeySpec = new SecretKeySpec(getCryptoKeyByteArray(length=16)); // 128 bits
Cipher encryptor = Cipher.getInstance("AES");
encryptor.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = encryptor.doFinal(plain);

Как предотвратить 9X_pad заполнение? Данные plain всегда имеют фиксированную 9X_jre длину и включают собственное заполнение. Как 9X_jre я могу разрешить plain быть 16 байтами, не заставляя 9X_core-java encrypted становиться 32 байтами?

14
1

  • Вы пробовали `Cipher.getInstance (" AES / CBC ...
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Java AES без заполнения

Смотрите мой комментарий. Извините, наверное, в первый раз надо было присмотреться повнимательнее.

  1. Измените "AES" на "AES/CBC/NoPadding"
  2. Измените decryptor.init(Cipher.DECRYPT_MODE, skeySpec); на decryptor.init(Cipher.DECRYPT_MODE, skeySpec, encryptor.gerParameters());

Чтобы зашифровать только 16 байт данных 9X_encrypted фиксированной длины, используя метод, не 9X_cipher требующий сохранения вектора инициализации, замените 9X_core-java "AES" на "AES/ECB/NoPadding"

Я выбираю ECB, потому что that is the default.

Если вам 9X_deciphering нужно зашифровать более 16 байт, рассмотрите 9X_pad возможность использования чего-то другого, кроме 9X_core-java ECB, which suffers a certain repetition detection flaw

В этом примере растрового изображения это 9X_decrypt изображение имеет повторяющиеся белые блоки, поэтому 9X_data-encryption вы можете вывести контур изображения, просто 9X_decrypt посмотрев, где блоки становятся разными.

9X_Java AES без заполнения_pad 9X_Java AES без заполнения_encryption

Если 9X_data-encryption вы шифруете только один блок, это не имеет 9X_cipher особого значения, только если вы шифруете 9X_jdk несколько объединенных блоков, ECB становится 9X_encryption разоблачающим.

Связанные: https://security.stackexchange.com/questions/15740/what-are-the-variables-of-aes

18
2

  • Обычно вы не хотите использовать CBC с NoPadding (или только если размер ...

Ответ #2

Ответ на вопрос: Java AES без заполнения

Согласен с @rossum, но это еще не все:

Для 9X_decrypt режима CTR требуется вектор инициализации 9X_j2se (IV). Это «счетчик» (это то, что означает 9X_jdk «CTR»). Если вы можете хранить IV отдельно 9X_aes (его не нужно защищать), это сработает. При 9X_.java расшифровке данных вам понадобится то же 9X_j2se значение IV.

Если вы не хотите хранить IV 9X_encryption и можете гарантировать, что никакие два значения не будут зашифрованы одним и тем же ключом, можно использовать фиксированный 9X_encryption IV. (даже массив нулей).

Вышеупомянутое очень важно, потому 9X_decrypt что шифрование более одного сообщения с 9X_decryption одной и той же комбинацией ключа / IV нарушает 9X_oraclejdk безопасность. См. Раздел Вектор инициализации (IV) в этой статье 9X_encryption Википедии: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

Реализация AES CTR вашего кода 9X_encrypt может быть:

SecretKeySpec skeySpec = new SecretKeySpec(getCryptoKeyByteArray(length=16)); 
Cipher encryptor = Cipher.getInstance("AES/CTR/NoPadding");

// Initialisation vector:
byte[] iv = new byte[encryptor.getBlockSize()];
SecureRandom.getInstance("SHA1PRNG").nextBytes(iv); // If storing separately
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

encryptor.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec); 
byte[] encrypted = encryptor.doFinal(plain); 

6
0

Ответ #3

Ответ на вопрос: Java AES без заполнения

Режим CTR не требует заполнения: "AES/CTR/NoPadding".

9X_decrypt

2
0