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 байтами?
- Вы пробовали `Cipher.getInstance (" AES / CBC ...
Ответ #1
Ответ на вопрос: Java AES без заполнения
Смотрите мой комментарий. Извините, наверное, в первый раз надо было присмотреться повнимательнее.
- Измените
"AES"
на"AES/CBC/NoPadding"
- Измените
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_data-encryption вы шифруете только один блок, это не имеет 9X_cipher особого значения, только если вы шифруете 9X_jdk несколько объединенных блоков, ECB становится 9X_encryption разоблачающим.
Связанные: https://security.stackexchange.com/questions/15740/what-are-the-variables-of-aes
- Обычно вы не хотите использовать 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);
Ответ #3
Ответ на вопрос: Java AES без заполнения
Режим CTR не требует заполнения: "AES/CTR/NoPadding"
.
9X_decrypt
-
1
-
1
-
1
-
7
-
6
-
6
-
4
-
9
-
4
-
1
-
3
-
1
-
7
-
3
-
3
-
4
-
1
-
1
-
2
-
3
-
3
-
3
-
4
-
1
-
1
-
2
-
3
-
4
-
4
-
5
-
5
-
14
-
6
-
9
-
6
-
1
-
3
-
4
-
2
-
9
-
7
-
2
-
4
-
6
-
2
-
2
-
5
-
3
-
2
-
5