将文本加密为AES/CBC/PKCS7Padding

Sha*_*nty 8 java encryption aes pkcs#7

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

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

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

这篇文章的链接在这里:

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

我改变

private final static String cI = "AES/CBC/PKCS5Padding";
Run Code Online (Sandbox Code Playgroud)

private final static String cI = "AES/CBC/PKCS7Padding";
Run Code Online (Sandbox Code Playgroud)

但Java无法为此找到提供商.

有人能告诉我我该怎么办?

Art*_* B. 18

Java仅提供PKCS#5填充,但它与PKCS#7填充相同.在Crypto.SE上看到这个问题:

PKCS#5填充和PKCS#7填充之间有什么区别

它们可以与AES和DES等公共分组密码互换.

  • 我应该改写。PKCS5 填充对 AES 无效,但 Java 仍然提供它,这意味着 Java 在撒谎,实际上正在使用 PKCS7 填充,在这种情况下,“PKCS5Padding”和“PKCS7Padding”对于所有意图和目的都是相同的。 (2认同)

小智 7

试试这个方法

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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 与 CBC 模式一起使用时,IV 必须是不可预测的。如果密钥是硬编码的并且密钥字节用作 IV,那么 IV 几乎是可预测的。IV 不是秘密值。您可以随机生成它并将其与密文一起发送给接收者。通常,这是通过在密文前添加 IV 来完成的。然后接收器将 IV 切掉并直接使用它。 (3认同)