5

目前,当我使用 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));
}

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

非常感谢您的帮助。

谢谢。-马特

4

4 回答 4

3

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

我很固执地使用 PKCS1Padding,但我没能成功。

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

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

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

于 2010-05-31T15:00:02.970 回答
2

检查您是否正确交换了密钥。

尝试使用不正确的密钥解密与解密填充错误的数据没有区别。

于 2009-08-20T05:53:04.387 回答
2

我正在解决在Objective-C中.Net和iPhone之间运行的类似问题,我认为答案在于RSACryptoServiceProvider文档中的这个小宝石:

与非托管 CAPI 中的 RSA 实现不同,RSACryptoServiceProvider 类在加密之后和解密之前反转加密字节数组的顺序。默认情况下,使用 RSACryptoServiceProvider 类加密的数据不能被 CAPI CryptDecrypt 函数解密,使用 CAPI CryptEncrypt 方法加密的数据不能被 RSACryptoServiceProvider 类解密。

有关详细信息,请参见此处:http: //msdn.microsoft.com/en-us/library/s575f7e2 (v=VS.90).aspx

于 2010-04-12T20:51:35.540 回答
0

我在使用 Bouncy Castle 1.48 时遇到了同样的问题,但它与键无关。相反,我发现我必须设置以下系统属性:

-Dorg.bouncycastle.pkcs1.strict=false
于 2013-07-31T03:01:33.383 回答