Rails AES 加密解密算法求教,Java 128 位 AES/ECB/PKCS5Padding ,始终对不上

suxiaohun · 2017年12月21日 · 最后由 zhandao 回复于 2017年12月22日 · 7326 次阅读

求教,最近在做一个 java 项目集成的问题,用到了 AES 加密,他们给的工具类如下:

  private static final  int INIT_SIZE = 128;
    private static final  String SECRET_IALGORITHM = "AES";
    private static final int ZERO = 0;
    private static final int ONE = 1;
    private static String derectory = "D:";

private static void doFile(int code, String sourceFilePath,String targetFilePath, String key) throws Exception{

        File file = new File(sourceFilePath);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        byte[] bytIn = new byte[(int) file.length()];
        bis.read(bytIn);
        bis.close();
        //aes对称加密算法  加密和解密用到的密钥是相同的
        //构造密钥生成器,指定为AES算法,不区分大小写
        KeyGenerator kgen = KeyGenerator.getInstance(SECRET_IALGORITHM);
        //根据key规则初始化密钥生成器
        //生成一个128位的随机源,根据传入的字节数组
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(key.getBytes());
        kgen.init(INIT_SIZE, secureRandom);
//        kgen.init(INIT_SIZE, new SecureRandom(key.getBytes()));
        //产生原始对称密钥
        SecretKey skey = kgen.generateKey();
        //获得原始对称密钥的字节数组
        byte[] raw = skey.getEncoded();
        //根据字节数组生成AES密钥
        SecretKeySpec skeySpec = new SecretKeySpec(raw, SECRET_IALGORITHM);

        //根据指定算法AES自成密码器
        Cipher cipher = Cipher.getInstance(SECRET_IALGORITHM);

        //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为使用的KEY
        if(0 == code){
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        }else if(1 == code){
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        }
        //将数据加密或解密
        byte[] bytOut = cipher.doFinal(bytIn);

        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(new File(targetFilePath)));
        bos.write(bytOut);
        bos.close();

    }

然后,他们项目回复说用的是 128 位 AES/ECB/PKCS5Padding, 我研究了下,也看了相关的帖子,写的加密算法如下

def aes128_encrypt(data,key)
      cipher = OpenSSL::Cipher.new 'aes-128-ecb'
      cipher.encrypt
      cipher.key = key
      cipher.iv = ''
      encrypted = cipher.update data
      encrypted << cipher.final
    end

基本翻遍了网上的帖子,加密后的数据怎么也对不上,是我遗漏了什么地方吗?求高人帮忙指点一下,感激不尽。

1 楼 已删除

再看了下... 这个先把 key + sha1prng 再转换成 key 的...

如果他们能把这个转换过的 key 给你就简单些,不然很难搞

luikore 回复

嗯嗯,多谢解答,找 Java 组的同事一起研究了下他们给的工具类,确实是将原始 的 key 转变成了另外一个 key,将那一段代码注释掉之后,可以匹配了。

直接扔过一个 Java 工具类,什么也不说,太浪费时间了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号