目前,当我使用 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));
}
是否有人看到缺少步骤或需要更改填充或项目?我已经在这个网站和其他网站上阅读了数小时,但还没有真正找到具体的解决方案。
非常感谢您的帮助。
谢谢。-马特