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

Mat*_*ver 6 c# java encryption rsa

目前,当使用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);
}
Run Code Online (Sandbox Code Playgroud)

这是我在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));
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的帮助.

谢谢.-Matt

Ras*_*ber 2

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

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