我正在开发一个使用java 6加密某些文本的Web应用程序。
我必须做的加密是CBC模式下的AES(Rijndael),带有PKCS7填充和128位密钥。
我看到一篇文章解释了如何以与我必须做的相同的方式进行加密,但使用了PKCS5填充。
文章的链接在这里:
我改变了
private final static String cI = "AES/CBC/PKCS5Padding";
要
private final static String cI = "AES/CBC/PKCS7Padding";
但是Java无法为此找到提供商。
有人可以告诉我我该怎么做吗?
答案 0 :(得分:17)
Java仅提供PKCS#5填充,但它与PKCS#7填充相同。在Crypto.SE上看到这个问题:
What is the difference between PKCS#5 padding and PKCS#7 padding
它们可以与AES和DES等公共块密码互换。
答案 1 :(得分:2)
Java规范列出了需要支持的多种加密模式(和填充)。 PKCS7Padding
不包括在内。
这些是任何Java实现必须支持的AES / CBC模式。
(有关详细信息,请参阅this answer)
Bouncy Castle确实有你需要的东西。
答案 2 :(得分:1)
试试这个方法
String KEY_AES = "**************";
public String encrypt(String value) {
try {
byte[] key = KEY_AES.getBytes("UTF-8");
byte[] ivs = KEY_AES.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(ivs);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, paramSpec);
return Base64.encodeToString(cipher.doFinal(value.getBytes("UTF-8")), Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}