日期:2014-05-20  浏览次数:20953 次

Java AES加密问题
使用KeyGenerator做AES加密解密,有两个问题:
1、kgen.init(128, new SecureRandom(okey)); 这句代码是使用128位密钥加密,也就是okey必须是128位字节,但我的okey长度不是128位(大于、小于都可以),为什么也能通过,得出密文,用该密文解密也没问题?

2、我看说AES支持128位、192位、256位加密,但使用kgen.init(192,xxx), kgen.init(256, xxx)就报Illegal key size or default parameters异常。为什么?

API说明不太明白。谢谢各位赐教。。。。


下面是加密的源代码
Java code

    /**
     * 数据加密
     * 
     * @param name
     *               算法名称
     * @param password
     *               密钥
     * @param message
     *               明文
     * @return 返回密文
     */
    public static byte[] Encode(String name, String password, byte[] message) {
        if (name == null || name.length() <= 0
                || password == null || password.length() <= 0
                || message == null || message.length <= 0)
            return null;
        
        if (!name.equals(ALGO_AES))
            return null;
        
        byte[] content = null;
        
        KeyGenerator kgen = null;
        
        try {
            kgen = KeyGenerator.getInstance(name);
            byte[] okey = password.getBytes();
            kgen.init(128, new SecureRandom(okey));

            SecretKey secretKey = kgen.generateKey();
            
            Cipher cipher = Cipher.getInstance(name);    // 创建密码器 
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 初始化
            content = cipher.doFinal(message);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }

        return content;
    }



------解决方案--------------------
1、kgen.init(128, new SecureRandom(okey)); 这句代码是使用128位密钥加密,也就是okey必须是128位字节,但我的okey长度不是128位(大于、小于都可以),为什么也能通过,得出密文,用该密文解密也没问题?

128位指的是kgen生成的密钥长度,不是你的okey的长度

2、我看说AES支持128位、192位、256位加密,但使用kgen.init(192,xxx), kgen.init(256, xxx)就报Illegal key size or default parameters异常。为什么?

AES算法支持多种密钥长度,但是不同的生产商实现的AES是不同的