javax.crypto.IllegalBlockSizeException AES解密

时间:2017-12-01 03:41:13

标签: java encryption aes sha256

    public static String decryption(byte[] encryptedIvTextBytes, String key) throws Exception {

    int ivSize = 16;
    int keySize = 16;

    // Extract IV.
   byte[] iv = new byte[ivSize];
    System.arraycopy(encryptedIvTextBytes, 0, iv, 0, iv.length);

    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

    // Extract encrypted part.
   int encryptedSize = encryptedIvTextBytes.length - ivSize;
    byte[] encryptedBytes = new byte[encryptedSize];
    System.arraycopy(encryptedIvTextBytes, ivSize, encryptedBytes, 0, encryptedSize);

    // Hash key.
    byte[] keyBytes = new byte[keySize];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(key.getBytes());
    System.arraycopy(md.digest(), 0, keyBytes, 0, keyBytes.length);
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");

    // Decrypt.
Cipher cipherDecrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipherDecrypt.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
    byte[] decrypted = cipherDecrypt.doFinal(encryptedBytes);

    return new String(decrypted);

}  

我的错误是非法的块大小异常。我错过了什么吗?我怎么能纠正我不知道。我尝试过转换为BAse64。但是我的错误增加了。这段代码比其他代码更好。

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:936)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at mysafe.MySafe.decryption(MySafe.java:171)
at mysafe.MySafe.main(MySafe.java:55)
C:\Users\Tuba\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: 
Java returned: 1

0 个答案:

没有答案