非对称加密算法,允许使用公钥和私钥进行加密和解密

时间:2019-08-24 20:54:28

标签: c# encryption public-key-encryption public-key

我有以下有效的非对称加密实现:

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框架中是否包含不对称加密,这使我可以在两个方向上同时使用两个密钥(公共密钥和私有密钥),如果使用一个密钥进行加密,则只能使用另一个密钥进行解密。 ?

1 个答案:

答案 0 :(得分:1)

RSA签名与使用私钥加密不同。

PKCS#1 v1.5签名:

  • 使用所选算法哈希内容。
  • 创建一个DigestInfo值来表示哈希。
  • 应用填充使消息几乎,但不完全是模数大小(此处省略了详细信息)。
  • 使用私钥应用RSA原语

请注意,最后一步没有说“加密”。

.NET中的RSA类为您执行填充操作,因此它们公开了Sign / Verify和Encrypt / Decrypt。您不能将它们用于交叉目的,也不能将这些类用于RSA原语(也称为“原始RSA”)。