如何在C#中使用公钥和私钥加密技术

cag*_*gin 20 c# encryption cryptography public-key-encryption private-key

我想使用公钥/私钥技术加密数据.我的意思是,用接收器的公钥加密,接收器可以用自己的私钥解密.

我怎样才能做到这一点?您有任何建议或示例代码吗?

Erw*_*win 27

代码示例:

private static string _privateKey;
private static string _publicKey;
private static UnicodeEncoding _encoder = new UnicodeEncoding();

private static void RSA()
{
  var rsa = new RSACryptoServiceProvider();
  _privateKey = rsa.ToXmlString(true);
  _publicKey = rsa.ToXmlString(false);

  var text = "Test1";
  Console.WriteLine("RSA // Text to encrypt: " + text);
  var enc = Encrypt(text);
  Console.WriteLine("RSA // Encrypted Text: " + enc);
  var dec = Decrypt(enc);
  Console.WriteLine("RSA // Decrypted Text: " + dec);
}

public static string Decrypt(string data)
{
  var rsa = new RSACryptoServiceProvider();
  var dataArray = data.Split(new char[] { ',' });
  byte[] dataByte = new byte[dataArray.Length];
  for (int i = 0; i < dataArray.Length; i++)
  {
    dataByte[i] = Convert.ToByte(dataArray[i]);
  }

  rsa.FromXmlString(_privateKey);
  var decryptedByte = rsa.Decrypt(dataByte, false);
  return _encoder.GetString(decryptedByte);
}

public static string Encrypt(string data)
{
  var rsa = new RSACryptoServiceProvider();
  rsa.FromXmlString(_publicKey);
  var dataToEncrypt = _encoder.GetBytes(data);
  var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray();
  var length = encryptedByteArray.Count();
  var item = 0;
  var sb = new StringBuilder();
  foreach (var x in encryptedByteArray)
  {
    item++;
    sb.Append(x);

    if (item < length)
      sb.Append(",");
  }

  return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • RSACryptoServiceProvider不用于加密随机数据块(数据大小仅限于keysize).通常,您应该使用OAEP填充,而不是明确地将其切换为PCKS1v1.5以帮助防止选择的密文攻击.没有人应该使用此示例代码. (15认同)
  • @jbtule:那么告诉我们用私有和公钥概念加密解密大数据最好的是什么? (11认同)
  • 您可能需要查看https://docs.microsoft.com/en-us/dotnet/standard/security/walkthrough-creating-a-cryptographic-application以获得一个好例子. (5认同)
  • @Mou根据我收集的信息,您生成一个对称密钥,然后使用接收者的公钥对其进行加密来传输。然后接收者用他们的私钥解密它,然后你用共享对称密钥加密你的大数据。您可以每 n 次传输更新对称密钥。我认为这就是 SSL 的工作原理(我确信这是一个非常简单的描述) (3认同)