我修改了可用的代码 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;
}
答案 0 :(得分:4)
人们常犯的一个错误就是将加密的字节放在一个 字符串和解密时,他们使用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");