Исключение в потоке «main» java .security.InvalidKeyException: недопустимый размер ключа. длина символа ключа 44 - PullRequest
0 голосов
/ 07 мая 2020

Исключение в потоке "main" java .security.InvalidKeyException: недопустимый размер ключа для кода ниже

Длина символа ключа равна 44. Я пробовал с длиной символа 24, я могу зашифровать. Помогите, пожалуйста, как решить эту проблему.


public static void main(String args[]) throws Exception {
    String plainText = "Hello world!";
    String encryptionKeyBase64 = "DWIzFkO22qfVMgx2fIsxOXnwz10pRuZfFJBvf4RS3eY=";
    System.out.println(encryptionKeyBase64.length());
    String ivBase64 = "AcynMwikMkW4c7+mHtwtfw==";
    EncDec encDec = new EncDec();
    String cipherText = encDec.encrypt(plainText, encryptionKeyBase64, ivBase64);
}

 public String encrypt(String plainText, String keyBase64, String ivBase64) throws Exception
    {
        byte[] plainTextArray = plainText.getBytes(StandardCharsets.UTF_8);
        byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
        byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);

        SecretKeySpec secretKey = new SecretKeySpec(keyArray, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");   
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
        return new String(DatatypeConverter.printBase64Binary(cipher.doFinal(plainTextArray)));
    }

    public String decrypt(String messageBase64, String keyBase64, String ivBase64) throws Exception {

        byte[] messageArray = DatatypeConverter.parseBase64Binary(messageBase64);
        byte[] keyArray = DatatypeConverter.parseBase64Binary(keyBase64);
        byte[] iv = DatatypeConverter.parseBase64Binary(ivBase64);

        SecretKey secretKey = new SecretKeySpec(keyArray, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
        return new String(cipher.doFinal(messageArray));
    }
}```

1 Ответ

2 голосов
/ 07 мая 2020

Поскольку вы используете «AES» в качестве схемы шифрования, длина ключа должна быть 16, 24 или 32 байта на входе SecretKeySpe c.

Таким образом, вы должны проверить длину байта [ ] keyArray, а не длину строки "encryptionKeyBase64", и убедитесь, что она имеет длину 16/24/32 байта.

Вы можете добавить строку

System.out.println("keyArray.length: " + 
DatatypeConverter.parseBase64Binary(encryptionKeyBase64).length);

перед использованием это в вашем методе шифрования / дешифрования.

Кстати: вектор инициализации «iv» должен иметь длину 16 байт (фиксированная, независимо от длины ключа). Вы можете легко это проверить, набрав

System.out.println("iv.length:       " + DatatypeConverter.parseBase64Binary(ivBase64).length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...