java AES解密函数有什么问题?

时间:2010-04-28 20:14:51

标签: java aes encryption

我修改了可用的代码 http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

并在程序中进行加密和解密方法。但我得到BadpaddingException .. 函数也返回null .. 为什么会这样?什么出错了?请帮帮我..

这些是我正在使用的变量:


kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            raw = new byte[]{(byte)0x00,(byte)0x11,(byte)0x22,(byte)0x33,(byte)0x44,(byte)0x55,(byte)0x66,(byte)0x77,(byte)0x88,(byte)0x99,(byte)0xaa,(byte)0xbb,(byte)0xcc,(byte)0xdd,(byte)0xee,(byte)0xff};
            skeySpec = new SecretKeySpec(raw, "AES");
            cipher = Cipher.getInstance("AES");

            plainText=null;
            cipherText=null;

以下是解密功能..


public String decrypt(String cipherText)
    {
        try
        {
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] original = cipher.doFinal(cipherText.getBytes());
            plainText = new String(original);
        }


        catch(BadPaddingException e)
        {

        }

        return plainText;
    }

3 个答案:

答案 0 :(得分:4)

来自Java-Security archives

人们常犯的一个错误就是将加密的字节放在一个 字符串和解密时,他们使用String.getBytes()来检索它。 由于String执行自己的字符编码,因此您使用的是byte [] 构造String对象和从getBytes()获得的byte [] 不一定是平等的。

答案 1 :(得分:1)

cipherText实际来自哪里?它需要是一个“原始”字节数组(不是字符串),并且需要以Cipher可以理解的方式加密。

AES(和一般的分组密码)可以在不同的“块模式”下运行,并且具有不同的“填充”,当您实例化密码时,您应该指出您正在使用的块模式(或者用于最初加密数据)。如果在传入原始字节时遇到BadPaddingException,则通常表示数据已使用不同的模式或填充进行加密。 (在这种情况下,它可能只是将数据转换为字符串的人工制品,正如我认为另一张海报所提到的。)

我写的一些可能有用的信息:

答案 2 :(得分:0)

由于您显示的代码非常少,因此很难预测可能导致异常的原因。

plainText为null,因为它被初始化为null,并且在为plainText赋值之前,decrypt函数抛出异常。

你对kgen怎么办?在链接到它的示例中,用于生成密钥规范的原始字节数组。在变量实例化列表中,您手动定义原始字节数组。

   KeyGenerator kgen = KeyGenerator.getInstance("AES");
   kgen.init(128); // 192 and 256 bits may not be available

   // Generate the secret key specs.
   SecretKey skey = kgen.generateKey();
   byte[] raw = skey.getEncoded();

   SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");