• AES加解密 linux 下出现解密失败问题


    windows 加解密正常,linux 下解密失败。报以下错误:

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

    问题点出现在密钥生成上:

    代码如下:

    protected SecretKeySpec genSecretKeySpec() throws DubheException{
            if (getPs() == null) {
                throw new DubheException("未配置密钥!");
            }
            KeyGenerator kgen = null;
            try {
                kgen = KeyGenerator.getInstance(getAlgorithm());
                kgen.init(getKeyLen(), new SecureRandom(getPs().getBytes()));  
                SecretKey secretKey = kgen.generateKey();  
                byte[] enCodeFormat = secretKey.getEncoded();  
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, getAlgorithm());
                return key;
            } catch (NoSuchAlgorithmException e) {
                throw new DubheException("未找到算法类型!", e);
            } 
        }

    此方式表现为:在windows 下密钥生成不变,在linux下生成变化的密钥,导致解密失败。

    改成如下方式问题得到解决:

    @Override
        protected SecretKeySpec genSecretKeySpec() throws DubheException{
            if (getPs() == null) {
                throw new DubheException("未配置密钥!");
            }
            KeyGenerator kgen = null;
            try {
                kgen = KeyGenerator.getInstance(getAlgorithm());
                
                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
                secureRandom.setSeed(getPs().getBytes());;
                kgen.init(getKeyLen(), secureRandom);
                SecretKey secretKey = kgen.generateKey();  
                byte[] enCodeFormat = secretKey.getEncoded();  
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, getAlgorithm());
                return key;
            } catch (NoSuchAlgorithmException e) {
                throw new DubheException("未找到算法类型!", e);
            } 
        }

    原因分析:

      SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法;

  • 相关阅读:
    .Net反编译实战
    PHP Yii框架开发——组织架构网站重构
    JS数据绑定模板artTemplate试用
    C# LDAP 管理(创建新用户)
    Ajax跨域请求数据实例(JSOPN方式)
    【AWK】:常用总结
    【Spark调优】:RDD持久化策略
    【ElasticSearch】:QueryDSL
    【ElasticSearch】:Mapping相关
    【ElasticSearch】:索引Index、文档Document、字段Field
  • 原文地址:https://www.cnblogs.com/hf-china/p/7929431.html
Copyright © 2020-2023  润新知