我已使用 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);”行抛出异常
并说“密钥不存在”。但是,如果我公开整个私钥和公钥,那么它就会愉快地运行。那么如何仅使用公钥信息来解密数据呢?
你不能——这就是公钥/私钥加密的要点。公众进行加密;私人进行解密。
听起来您需要某种密钥交换模式。例如;如果您的解码器应用程序尝试从另一个数据源(源应用程序)解密信息,我将实现如下所示的内容:
- 源应用程序生成对称密钥,如 AES。
- 解码器应用程序生成公钥和私钥对。
- 源应用程序向解码器应用程序询问公钥。
- 源应用程序使用公钥对对称密钥进行加密,并将其发送回解码器应用程序。
- 解码器应用程序使用私钥来解密对称密钥。
- 解码器应用程序从源应用程序获取使用对称密钥加密的数据。
- 解码器应用程序使用交换的对称密钥来解密其接收到的信息。
仅举一个例子;但说明了如何在两个应用程序之间交换数据而不通过线路传输任何敏感信息的基础知识。根本不需要对称密钥;但这是一种非常常见的模式,因为 RSA 在加密大量信息时开始引入问题。 RSA 最好只加密对称加密密钥。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)