在 C# 中使用 RSA 加密并在 Java 中使用解密时出现填充错误

2023-12-06

目前,当我使用 Java 解密 C# 中生成的 Base64 编码的 RSA 加密字符串时,收到以下错误:

javax.crypto.BadPaddingException:不是 PKCS#1 块类型 2 或零填充

.NET 和 Java 交换之间的设置过程是通过在 .NET 密钥存储中创建私钥,然后从提取的 PEM 文件中完成的,使用 keytool 创建带有私钥的 JKS 版本。 Java加载已经创建的JKS并将Base64字符串解码为字节数组,然后使用私钥解密。

以下是我在 C# 中创建加密字符串的代码:

public string Encrypt(string value) {
    byte[] baIn = null;
    byte[] baRet = null;
    string keyContainerName = "test";

    CspParameters cp = new CspParameters();
    cp.Flags = CspProviderFlags.UseMachineKeyStore;
    cp.KeyContainerName = keyContainerName;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

    // Convert the input string to a byte array 
    baIn = UnicodeEncoding.Unicode.GetBytes(value);

    // Encrypt
    baRet = rsa.Encrypt(baIn, false);

    // Convert the encrypted byte array to a base64 string
    return Convert.ToBase64String(baRet);
}

这是我用 Java 编写的代码,用于解密输入的字符串:

public void decrypt(String base64String) {
    String keyStorePath = "C:\Key.keystore";
    String storepass = "1234";
    String keypass = "abcd";
    byte[] data = Base64.decode(base64String);
    byte[] cipherData = null;

    keystore = KeyStore.getInstance("JKS");
    keystore.load(new FileInputStream(keyStorePath), storepass.toCharArray());

    RSAPrivateKey privateRSAKey = (RSAPrivateKey) keystore.getKey(alias, keypass.toCharArray());

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.DECRYPT_MODE, privateRSAKey);
    cipherData = cipher.doFinal(data);

    System.out.println(new String(cipherData));
}

有人发现缺少步骤或需要更改填充或项目吗?我已经在这个网站和其他网站上阅读了几个小时,但还没有真正找到具体的解决方案。

非常感谢您的帮助。

谢谢。 -马特


我遇到了完全相同的问题,我终于找到了解决方案!

我很顽固地使用 PKCS1Padding,但我没能让它发挥作用。

我使用得到的最好结果“rsa.Encrypt(baIn,假)”在 C# 端和“RSA/无/无填充”在Java端是这种字符串:“☻?o+_>??5?l0Q*???*?R▲???♀7...”,后面是我解密的字符串。因此,在某种程度上它被解密了,但由于没有指定填充,数据被转移。所以我尝试了 bouncycastle 中可用的所有填充,但我总是会收到诸如“块大小不正确”或“数据哈希错误”之类的错误。

所以我决定开始尝试 OAEP 填充,我终于成功地通过使用它来工作“rsa.Encrypt(baIn,true)”在 C# 端和“RSA/NONE/OAEPWithSHA1AndMGF1Padding”在java方面!

它对我有用,我希望它也对你有用!如果它不起作用,请确保您使用的是正确的密钥,通常问题出在密钥上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中使用 RSA 加密并在 Java 中使用解密时出现填充错误 的相关文章

随机推荐