Ожидаемая ошибка IV длины 0 в AES 128 Decypt - PullRequest
0 голосов
/ 26 февраля 2020

Я знаю, что многие из этих вопросов были заданы. но в моем случае ошибка:

java.security.InvalidAlgorithmParameterException: expected IV length of 0

Я пытаюсь AES 128 CB C mode

код:

byte[] iv = new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
                            , (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};

        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] decryptedBytes = cipher.doFinal(encrypted);
        return decryptedBytes;

Если я изменяю вектор инициализации что-то вроде этого, как предложенная ошибка:

byte[] iv = new byte[]{};

Я получаю ошибку:

java.security.InvalidAlgorithmParameterException: expected IV length of 16

1 Ответ

0 голосов
/ 26 февраля 2020

Для режима CB C вы должны вызвать опции

 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

NoPadding, что означает отсутствие заполнения. Это полезно, если

  • Ваши данные всегда кратны размеру блока AES, т.е. 128k
  • Вы будете выполнять заполнение, возможно, разрабатывая новый.

Если вы говорите о режиме ECB, то для этого не требуется IV и вы не используете ECB. Это небезопасно. Если вам действительно нужно, тогда звоните без IV.

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

Если ваши Android совпадения с целями предпочитают режим GCM вместо ECB или CB C. Это современный режим шифрования; Шифрование с проверкой подлинности (с соответствующими данными). Вы получите Конфиденциальность, аутентификацию и целостность.

...