将文本加密为AES / CBC / PKCS7Padding

时间:2015-03-24 12:30:46

标签: java encryption aes pkcs#7

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

我必须做的加密是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-bits/

我改变了

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

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

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

有人可以告诉我我该怎么做吗?

3 个答案:

答案 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模式。

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

(有关详细信息,请参阅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;
    }