我在加密时遇到以下代码的异常。 创建的密钥是“[B @ 29ee9faa”。 “加密时出错:java.security.InvalidKeyException:无效的AES密钥长度:11个字节”
此外,我已经在jre / lib / security中更新了local_policy和Us_export_policy。
public static String generateKey(String eisId)
{
String uuidKey = null;
try {
KeyGenerator gen = KeyGenerator.getInstance("AES");
gen.init(128); /* 128-bit AES */
SecretKey secret = gen.generateKey();
uuidKey = secret.getEncoded().toString();
System.out.println("uuidKey : "+uuidKey);
// Store in DB
// **********************
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return uuidKey;
}
public static SealedObject encryptData(String eisId, SecurityDomainDTO sDObj)
{
try
{
String secret = generateKey(eisId);
SecretKeySpec aesKey = new SecretKeySpec(secret.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
SealedObject so = new SealedObject(sDObj, cipher);
return so;
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
答案 0 :(得分:0)
“[B @ 29ee9faa”字符串是一个很大的线索。这就是您在toString()
上致电byte[]
时所获得的结果。它不代表字节数组的内容。相反,它重新定义内部类型名称(“[B”)和对象的标识哈希码。
这是错误:
uuidKey = secret.getEncoded().toString();
这不是格式化字节数组的内容的正确方法。
我建议您使用Base64
类; e.g。
Base64.Encoder encoder = Base64.getEncoder();
String encoded = encoder.encode(bytes);
...
Base64.Decoder decoder = Base64.getDecoder();
byte[] bytes = decoder.decode(encoded);