基于密码的加密 - 最后一个块在解密中不完整

Posted

技术标签:

【中文标题】基于密码的加密 - 最后一个块在解密中不完整【英文标题】:Password based encryption-last block incomplete in decryption 【发布时间】:2015-02-10 11:56:37 【问题描述】:

我在使用 PBEWithSHA256And256BitAES-CBC-BC 算法进行基于密码的加密/解密时遇到问题。当我到达 cipher.doFinal 时,我得到:javax.crypto.IllegalBlockSizeException:解密时最后一个块不完整。

public static String encrypt(String salt, String password, byte[] object) throws GeneralSecurityException 
    PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt.getBytes(), 1000);
    PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());

        SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
        SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

        Cipher encryptionCipher = Cipher.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
        encryptionCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

        byte[] encryptedObject = encryptionCipher.doFinal(object);

    return new String(encryptedObject);


public static String decrypt(String encryptedObject, String password, String salt) throws GeneralSecurityException
    PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), 1000);
    PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());

        SecretKeyFactory keyFactory
                = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
        SecretKey passwordKey = keyFactory.generateSecret(keySpec);

        Cipher cipher = Cipher.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
        cipher.init(Cipher.DECRYPT_MODE, passwordKey, parameterSpec);

        byte[] decryptedObject = cipher.doFinal(encryptedObject.getBytes());

    return new String(decryptedObject);

还有主要的:

Security.addProvider(new BouncyCastleProvider());
String text = "plaintext";
String salt = "salt";
String password = "password";
String encrypted = encrypt(salt, password, text.getBytes());
String decrypted = decrypt(encrypted, password, salt);
System.out.println(decrypted);

我错过了什么吗?当其他人遇到此异常时,他们没有使用相同的盐进行加密和解密,或者他们没有从 Base64 解码加密文本。这些都没有帮助解决我的问题。

【问题讨论】:

【参考方案1】:

加密和解密的输出应该是 byte[] 而不是 String。

【讨论】:

【参考方案2】:

PBEWithSHA256And256BitAES-CBC-BC 应仅用于密钥生成过程,不能用于加密/解密过程本身。

你应该只继续(例如):

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

【讨论】:

以上是关于基于密码的加密 - 最后一个块在解密中不完整的主要内容,如果未能解决你的问题,请参考以下文章

解密 CakePHP 1.2 数据

Java中基于AES-256密码的加密/解密

ZZNUOJ_用C语言编写程序实现1172:密码解密(指针专题)(附完整源码)

LoadRunner脚本优化-加密与解密

如何使用Bouncy Castle解密AES / CCM加密密文?

rsa解密错误