我有以下有效的非对称加密实现:
private static RSAParameters privateKey;
private static RSAParameters publicKey;
private static void RSA()
{
var rsa = new RSACryptoServiceProvider();
privateKey = rsa.ExportParameters(true);
publicKey = rsa.ExportParameters(false);
byte[] originalMessage = GenerateRandomData();
byte[] encryptedMessage = Using(publicKey).Encrypt(originalMessage, false);
byte[] decryptedMessage = Using(privateKey).Decrypt(encryptedMessage, false);
Debug.Assert(originalMessage.SequenceEqual(decryptedMessage));
}
private static RSACryptoServiceProvider Using(RSAParameters parameters)
{
RSACryptoServiceProvider encryptor = new RSACryptoServiceProvider();
encryptor.ImportParameters(parameters);
return encryptor;
}
private static byte[] GenerateRandomData()
{
Random rnd = new Random();
byte[] originalData = new byte[10];
rnd.NextBytes(originalData);
return originalData;
}
我用它用接收者的公钥[Using(publicKey).Encrypt(originalData)
]加密数据,以便接收者只能解密数据[Using(privateKey).Decrypt(encryptedData)
]。
现在,我想在以下用例中重用非对称加密:收件人发布数据,每个知道收件人公钥的人(基本上是系统中的每个人,但系统外的人都没有,例如,防止将可读数据泄漏到公众)可以阅读。发布者使用其私钥进行加密,而其公钥将用于解密:
byte[] originalData = GenerateRandomData();
byte[] publishedData = Using(privateKey).Encrypt(originalData, false);
byte[] retrievedData = Using(publicKey).Decrypt(publishedData, false);
Debug.Assert(originalData.SequenceEqual(retrievedData));
但是这会产生一个
System.Security.Cryptography.CryptographicException
HResult=0x8009000D
Message=Keyset does not exist.
我不想为数据发布部分使用其他的公钥-私钥对,尤其是在这种情况下,这意味着将公钥设为私钥。键入...时听起来已经很尴尬了。
编辑: .NET框架中是否包含不对称加密,这使我可以在两个方向上同时使用两个密钥(公共密钥和私有密钥),如果使用一个密钥进行加密,则只能使用另一个密钥进行解密。 ?
答案 0 :(得分:1)
RSA签名与使用私钥加密不同。
PKCS#1 v1.5签名:
请注意,最后一步没有说“加密”。
.NET中的RSA类为您执行填充操作,因此它们公开了Sign / Verify和Encrypt / Decrypt。您不能将它们用于交叉目的,也不能将这些类用于RSA原语(也称为“原始RSA”)。