Java 将文本加密到AES/CBC/PKCS7Padding

Java 将文本加密到AES/CBC/PKCS7Padding,java,encryption,aes,pkcs#7,Java,Encryption,Aes,Pkcs#7,我正在开发一个web应用程序,用Java6加密一些文本 我要做的加密操作是CBC模式下的AES(Rijndael),带有PKCS7填充和128位密钥 我看了一篇文章,解释了如何以我必须使用的相同方式进行加密,但是使用了PKCS5填充 文章链接如下: 我改变 private final static String cI = "AES/CBC/PKCS5Padding"; 到 但是Java找不到这方面的提供者 有人能告诉我该怎么做吗?Java规范列出了许多需要支持的加密模式(和填充)PKCS7填

我正在开发一个web应用程序,用Java6加密一些文本

我要做的加密操作是CBC模式下的AES(Rijndael),带有PKCS7填充和128位密钥

我看了一篇文章,解释了如何以我必须使用的相同方式进行加密,但是使用了PKCS5填充

文章链接如下:

我改变

private final static String cI = "AES/CBC/PKCS5Padding";

但是Java找不到这方面的提供者


有人能告诉我该怎么做吗?

Java规范列出了许多需要支持的加密模式(和填充)<不包括代码>PKCS7填充

这些是任何Java实现都必须支持的AES/CBC模式

  • AES/CBC/NoPadding(128位密钥)
  • AES/CBC/PKCS5P添加(128位密钥)
(有关更多信息,请参阅)

Java只提供PKCS#5填充,但与PKCS#7填充相同。请参阅Crypto.SE上的此问题:

对于AES和DES等常用分组密码,它们是可互换的。

试试这种方法

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;
    }

创建安全敏感数据时,请尝试使用最新的JRE。如果您的系统易受攻击,使用AES-256并不意味着什么。当与CBC模式一起使用时,IV必须是不可预测的。如果密钥是硬编码的,并且密钥字节用作IV,那么IV几乎是可预测的。IV不是一个秘密值。您可以随机生成它并将其与密文一起发送给接收者。通常,这是通过在密文前面加上IV来完成的。然后接收器将IV切掉并直接使用它。这是不同的:PKCS7填充“允许块大小最大为255字节”,与PKCS5的“8字节”不同。我应该重新措辞。PKCS5填充对AES无效,但Java仍然提供它,这意味着Java正在撒谎,并且实际上正在使用PKCS7填充,在这种情况下,
PKCS5Padding
PKCS7Padding
对于所有目的和目的都是相同的。
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;
    }