java.security.Исключение InvalidKeyException: неправильный алгоритм: требуется удаление или утроение

#java #encryption #cryptography #3des

#java #шифрование #криптография #3des

Вопрос:

Я написал этот код, мой ключ: «ooWqEPcw7KR / h / JIbrFCRHiEVaybvnB2».

     try
    {
        Base64Decoder base64Decoder=new Base64Decoder();

        String encryptType="DESede/ECB/PKCS5Padding";
        String workingKey="ooWqEPcw7KR/h/JIbrFCRHiEVaybvnB2";
        SecretKey secretKey=new SecretKeySpec(base64Decoder.decode(workingKey), encryptType);

        Cipher cipher=Cipher.getInstance(encryptType);
        cipher.init(1, secretKey);
    }
    catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException e)
    {
        e.printStackTrace();
    }
  

Но я получаю эту ошибку!!!

 java.security.InvalidKeyException: Wrong algorithm: DESede or TripleDES required
    at com.sun.crypto.provider.DESedeCrypt.init(DESedeCrypt.java:65)
    at com.sun.crypto.provider.ElectronicCodeBook.init(ElectronicCodeBook.java:93)
    at com.sun.crypto.provider.CipherCore.init(CipherCore.java:582)
    at com.sun.crypto.provider.CipherCore.init(CipherCore.java:458)
    at  com.sun.crypto.provider.DESedeCipher.engineInit(DESedeCipher.java:166)
    at javax.crypto.Cipher.implInit(Cipher.java:802)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1249)
    at javax.crypto.Cipher.init(Cipher.java:1186)
    at EncryptText.main(EncryptText.java:24)
  

Комментарии:

1. новая спецификация SecretKeySpec(keyBytes, «Удаление»); Обратите внимание, что использование 1 intead of Cipher.ENCRYPT_MODE не является хорошей идеей, используйте constatnts.

2. Я использовал из Cipher. ENCRYPT_MODE, но не сработал. Приведенный выше код работает в Android Studio. но это не работает в IntellijIDEA

3. Вы изменили new SecretKeySpec(keyBytes, "DESede"); ?

4. Да, да, да. Спасибо. у меня это работает. Вы сэкономили мое время.

Ответ №1:

Вы должны написать SecretKeySpec как

 SecretKey secretKey=new SecretKeySpec(base64Decoder.decode(workingKey),"DESede");
  

Также используйте Cipher.ENCRYPT_MODE и Cipher.DECRYPT_MODE вместо констант.

Ответ №2:

DESedeCrypt класс поддерживает только DESede и TripleDES алгоритмы, согласно исходному коду:

 void init(boolean decrypting, String algorithm, byte[] keys)
        throws InvalidKeyException {
    if (!algorithm.equalsIgnoreCase("DESede")
                amp;amp; !algorithm.equalsIgnoreCase("TripleDES")) {
        throw new InvalidKeyException
            ("Wrong algorithm: DESede or TripleDES required");
    }
  

Ваш код должен использовать одно из двух в SecretKey . Cipher Может оставаться как DESede/ECB/PKCS5Padding :

 String workingKey = "ooWqEPcw7KR/h/JIbrFCRHiEVaybvnB2";
SecretKey secretKey = new SecretKeySpec(
        Base64.getDecoder().decode(workingKey), 
        "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(1, secretKey);