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

Asymetric encryption algorithm which allows to use public and private key for both encryption and decryption

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

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;
}

我用它用接收方的public密钥[Using(publicKey).Encrypt(originalData)]加密数据,这样接收方只能解密数据[Using(privateKey).Decrypt(encryptedData)]。

现在我想为以下用例重用非对称加密:收件人发布数据和每个知道收件人 public 密钥的人(基本上是系统中的每个人,但系统外没有人,例如防止将可读数据泄漏到 public) 可以读取的保护。发布者使用他的私钥进行加密,他的 public 密钥将用于解密:

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.

我不想在数据发布部分使用不同的 public-private-key-pair,尤其是在这种情况下,这意味着使 public 成为私钥。打字的时候已经很别扭了...

编辑:.NET 框架中是否包含非对称加密,如果一个密钥仅用于加密,它允许我在两个方向上使用两个密钥(public 和私有)另一个可以用来解密吗?

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

PKCS#1 v1.5 签名:

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

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

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