我使用RSACryptoServiceProvider加密了一个文本。我导出了公钥和私钥。显然我只是想在解码器应用程序中公开公钥,所以我编写了如下代码:
private const string PublicKey = "<RSAKeyValue><Modulus>sIzQmj4vqK0QPd7RXKigD7Oi4GKPwvIPoiUyiKJMGP0qcbUkRPioe2psE/d3c1a2NY9oj4Da2y1qetjvKKFad2QAhXuql/gPIb1WmI+f6q555GClvHWEjrJrD/ho7SLoHbWd6oY6fY609N28lWJUYO97RLVaeg2jfNAUSu5bGC8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
private string Decrypt()
{
byte[] encryptedKeyAsBytes = Convert.FromBase64String(_encryptedKey);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(PublicKey);
// read ciphertext, decrypt it to plaintext
byte[] plainBytes = rsa.Decrypt(encryptedKeyAsBytes, false);
string plainText = System.Text.Encoding.ASCII.GetString(plainBytes);
return plainText;
}
但是在“byte [] plainBytes = rsa.Decrypt(encryptedKeyAsBytes,false);”行引发异常; 并说“钥匙不存在”。但是,如果我暴露整个私钥和公钥,那么它会很愉快地运行。那么如何仅使用公钥信息解密数据呢?
答案 0 :(得分:6)
你不能 - 这是公钥/私钥加密的重点。公众进行加密;私人进行解密。
听起来你需要某种密钥交换模式。例如;如果你的解码器应用程序试图解密来自另一个数据源(源应用程序)的信息,我会实现这样的事情:
只有一个例子;但说明了如何在两个应用程序之间交换数据的基础知识,而无需通过网络传输任何敏感信息。根本不需要对称密钥;但这是一种非常常见的模式,因为RSA在加密大量信息时开始引入问题。 RSA最好只是加密对称加密密钥。
答案 1 :(得分:5)
简短的回答是:你做不到。要解密消息,您需要私钥,这是非对称加密的主要原则。
您使用某人的公钥加密邮件,以便只有拥有相应私有密钥的人才能解密它们。
这就是公钥被称为公共的原因 - 您可以安全地将其分发给公众,以便他们可以加密要由相应私钥的唯一所有者读取的邮件。
答案 2 :(得分:2)
问题在于您要加密和签名。
加密是任何人可以写消息的地方,但只有私钥持有者可以读取它。签名是任何人可以读取消息的地方,但只有私钥持有者可以写它。
当您调用Decrypt时,RSACryptoServiceProvider正在寻找加密,即公共写入私有读取。因此它会查找私钥。
您希望使用SignData和VerifyData函数对有效负载进行签名,以便人们无法对其进行编写。