Тройной des с режимом cbc: java.security.invalidalgorithmparameterexception: неправильная длина iv: должна быть длиной 8 байтов

Я пытаюсь реализовать шифрование / дешифрование 3DES в режиме CBC в java.

Вектор инициализации 0000000000000000
Зашифрованная строка: DD446C051A83BFD98144C348935C61D81398CF29CCFE1CCD
Ключ для дешифрования - DCBA4F836E45BAB04FAB2937454075D9

Я получаю сообщение об ошибке ниже. Любая помощь будет высоко ценится. Спасибо.

java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 8 bytes long

Код:

import java.security.Key; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESedeKeySpec; 
import javax.crypto.spec.IvParameterSpec;

import org.apache.commons.codec.binary.Base64; 

public class DES3 { 

    private static final String IV = "01234567"; 
    private static final String CHARSET = "utf-8"; 

    public static String decrypt(String iv, String secretKey, String encryptText) throws Exception { 
        DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 
        Key deskey = keyfactory.generateSecret(spec); 
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
        cipher.init(Cipher.DECRYPT_MODE, deskey, ips); 
        byte[] decryptData = cipher.doFinal(Base64.decodeBase64(encryptText)); 
        return new String(decryptData, CHARSET); 
    } 

    public static String decrypt(String secretKey, String encryptText) throws Exception { 
        return decrypt(IV, secretKey, encryptText); 
    } 

    public static void main(String[] args) {

        try {
            String iv="0000000000000000";
            System.out.println("iv size"+iv.getBytes("UTF8").length);
            decrypt(iv, "DCBA4F836E45BAB04FAB2937454075D9", "DD446C051A83BFD98144C348935C61D81398CF29CCFE1CCD");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

1. Пришло время изучить двоичный код и такие кодировки, как шестнадцатеричный (шестнадцатеричный), Base64, ASCII и UTF-8. 2. IV из всех нулей (0x00) не является безопасным, вместо этого используйте случайный IV, просто добавьте к зашифрованным данным префикс IV для использования при расшифровке, он не должен быть секретным.

zaph 11.04.2018 20:23
1
1
1 766
1

Ответы 1

Ваша проблема здесь:

 String iv="0000000000000000";

который показывает, что ваш IV - это шестнадцатеричная строка. Но в своей функции дешифрования вы используете:

iv.getBytes()

для этого IV. Очевидно, это более 16 байт. Вам нужно преобразовать шестнадцатеричную строку в байт, а не только использовать функцию getBytes(). getBytes() преобразует каждый чат в соответствующий код ASCII, поэтому вы получите массив из 16 байтов каждый 0x30, а не массив из 8 байтов каждый 0.

Кстати, у вас такая же проблема с секретным ключом и вашим вводом.

Вы можете проверить hexStringToByteArray () здесь.

Спасибо. Я сохранил это, потому что считаю, что для дешифрования 3DES используется 16 байтов IV. Я расшифровал значения в моем коде с помощью онлайн-дешифратора. Он использует 16 байт. Есть мысли, пожалуйста? Спасибо Проверьте ссылку: tripledes.online-domain-tools.com/link/11da349gxUIcgKonRz

Preetam 12.04.2018 17:32

@Preetam, ты ошибаешься. и DES, и 3DES имеют размер блока и IV равный 8, а не 16. Небольшой поиск показывает это: en.wikipedia.org/wiki/Triple_DES 3DES просто использует DES 3 раза, он не меняет IV или размер блока. Вдобавок в ссылке, которую вы мне прислали, IV тоже 8 байт ... <. <

Afshin 12.04.2018 17:37

Другие вопросы по теме