javax.crypto.BadPaddingException: Given final block not properly padded解决方案

作者: deepwinter 分类: 后端 发布时间: 2019-10-21 10:41 点击量: 43 次阅读

问题

JAVA的AES/DES加密解密在windows上测试一切正常,上传到Linux系统上在解密时就出现错误。

查看日志发现出现此异常

javax.crypto.BadPaddingException: Given final block not properly padded

问题原因

这个问题是在生成key的时候出现错误的,其实就是SecureRandom创建的方式不同而引起的错误。
代码如下:

new SecureRandom(key.getBytes())

SecureRandom实现完全随操作系统本身的內部状态,该实现在windows上每次生成的key都相同,但是在solaris或部分linux系统上则不同。


解决方案

原来的代码:

private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
    if (null == key || key.length() == 0) {
        throw new NullPointerException("key not is null");
    }
    SecretKeySpec key2 = null;
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, new SecureRandom(key.getBytes()));
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        key2 = new SecretKeySpec(enCodeFormat, "AES");
    } catch (NoSuchAlgorithmException ex) {
        throw new NoSuchAlgorithmException();
    }
    return key2;

}

修改后代码:

private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
    if (null == key || key.length() == 0) {
        throw new NullPointerException("key not is null");
    }
    SecretKeySpec key2 = null;
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    random.setSeed(key.getBytes());
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, random);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        key2 = new SecretKeySpec(enCodeFormat, "AES");
    } catch (NoSuchAlgorithmException ex) {
        throw new NoSuchAlgorithmException();
    }
    return key2;

}

参考:https://www.cnblogs.com/zempty/p/4318902.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注