AES-256和PKCS7Padding在Java中失败

时间:2014-09-19 20:47:55

标签: java encryption aes jce pkcs#7

我有几个库,C#,PHP和Android,它们都以相同的方式加密/解密字符串,因此它们彼此兼容,即C#将数据写入并加密到数据库,PHP可以成功解密它并返回原始字符串。

我现在需要使用标准Java应用程序做同样的事情,所以我从我的Android库中获取代码并需要库,但我得到了一个异常。据我所知,代码不是特定于Android的,所以它应该不是问题。

以下是我的加密功能

public static String encrypt(String plainPasword)
    {
            String password = "";
            try
            {
                SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");
                IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII"));

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

                cipher.init(Cipher.ENCRYPT_MODE, key, iv);

                byte[] encoded = cipher.doFinal(plainPasword.getBytes());
                password = new String(Base64.encodeBase64(encoded));

            }
            catch (Exception ex)
            {
                System.err.println("Encryption Exception: " + ex.toString());
            }
            return password;
    }

当我致电Encryption.encrypt("myString");时,我收到以下异常:

Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding

正如我所说,这段代码在Android上运行良好,它在运行的地方不应该有任何区别。

感谢您提供的任何帮助。

更新

我发现由于评论链接,我需要PKCS5Padding而不是7。我现在虽然得到以下例外:

Encryption Exception: java.security.InvalidKeyException: Illegal key size

2 个答案:

答案 0 :(得分:18)

首先,在Java中,标准填充名称是PKCS5Padding,而不是PKCS7Padding。 Java实际上正在执行PKCS#7填充,但在JCA规范中,PKCS5Padding是给定的名称。

接下来,您尝试使用AES-256,因此您需要安装Unlimited Strength Jurisdiction政策文件。

希望这只是一个例子,你没有为每条消息使用相同的IV,对吧?

答案 1 :(得分:-1)

@Boardy如果您仍然遇到问题,那么我认为您必须使用MessageDigest,它对于C#和Java都兼容。我曾遇到过类似的AES 256加密和解密问题。示例代码如下。

public static String encryptWithAES256(String strToEncrypt) throws Exception
{
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] encodedhash = digest.digest(KEY.getBytes(StandardCharsets.UTF_8));
    IvParameterSpec ivspec = new IvParameterSpec(Arrays.copyOf(KEY.getBytes(),16));
    SecretKeySpec secretKey = new SecretKeySpec(encodedhash, AES_ENCRYPTION_ALGORITHM);
    Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
    return new String(Base64.encodeBase64(cipher.doFinal(strToEncrypt.getBytes(CHARACTER_ENCODING))));
}