将文本加密为 AES/CBC/PKCS7Padding

Encrypt text to AES/CBC/PKCS7Padding

我正在开发一个 Web 应用程序来使用 java 6 加密一些文本。

我必须做的加密是 CBC 模式的 AES (Rijndael),具有 PKCS7 填充和 128 位密钥。

我看到一篇文章解释了如何用我必须做的相同方式加密,但使用 PKCS5 填充。

文章的link在这里:

https://bit502.wordpress.com/2014/06/27/codigo-java-encriptar-y-desencriptar-texto-usando-el-algoritmo-aes-con-cifrado-por-bloques-cbc-de-128-bits/

我改

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

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

但是 Java 无法为此找到提供商。

谁能告诉我该怎么做?

Java 规范列出了许多需要支持的加密模式(和填充)。 PKCS7Padding 不包括在内。

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

  • AES/CBC/NoPadding(128 位密钥)
  • AES/CBC/PKCS5Padding(128 位密钥)

(有关详细信息,请参阅 this answer

Bouncy Castle 确实有您需要的东西。

Java 只提供 PKCS#5 填充,但与 PKCS#7 填充相同。在 Crypto.SE 上查看此问题:

What is the difference between PKCS#5 padding and PKCS#7 padding

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