我正在尝试使用PHP为服务器和客户端的C#表单应用程序创建一个在线数据库应用程序。 在服务器上,我使用带有PHPSecLib的公共RSA密钥加密一个简单的字符串。然后C#应用程序接收该字符串并尝试使用相应的私钥解密它。 字节在服务器上进行base64编码,并通过C#再次解码为字节。我使用PHPSecLib创建了密钥对。
这是我在客户端应用程序上使用的代码:
public string rsa_decrypt(string encryptedText, string privateKey) {
byte[] bytesToDecrypt = Convert.FromBase64String(encryptedText);
Pkcs1Encoding decrypter = new Pkcs1Encoding(new RsaEngine());
//the error occurs on this line:
AsymmetricCipherKeyPair RSAParams = (AsymmetricCipherKeyPair)new PemReader(new StringReader(privateKey)).ReadObject();
decrypter.Init(false, RSAParams.Private);
byte[] decryptedBytes = decrypter.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length);
string decryptedString = Convert.ToBase64String(decryptedBytes);
return decryptedString;
}
但是,我在上面指定的行上得到以下错误^。
未处理的类型' System.IO.IOException'发生在 BouncyCastle.Crypto.dll
其他信息:-----未找到END RSA PRIVATE KEY
我相信密钥对组合没有任何问题,因为在我尝试解密任何内容之前我收到错误。
privateKey
参数当前使用以下格式硬编码到脚本中:
string privateKey = "-----BEGIN RSA PRIVATE KEY-----XXXXXXXX-----END RSA PRIVATE KEY-----";
所以在我看来,页脚实际上包含在字符串中...我已经调试过并且用谷歌搜索了但我似乎无法解决它。我对RSA& Bouncycastle很陌生,所以也许我只是使用了错误的方法。
希望你能帮忙,谢谢! - G4A
P.S。这是我的第一个Stackoverflow问题,我刚刚创建了一个帐户,所以如果你也可以给我一些关于我提出这个问题的方式的反馈;太棒了!
答案 0 :(得分:8)
您需要在前/后封装边界文本和Base64数据之间添加一个新行,所以:
string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nXXX\r\n-----END RSA PRIVATE KEY-----";
这是因为pem规范允许两者之间存在其他文本标题。
答案 1 :(得分:1)
如果这不起作用
"-----BEGIN RSA PRIVATE KEY-----\r\nXXXXXXXX\r\n-----END RSA PRIVATE KEY-----"
请尝试一下
"-----BEGIN RSA PRIVATE KEY-----
XXXXXXXX
-----END RSA PRIVATE KEY-----"