C# RSA加密/解密带传输

标签 c# cryptography rsa

我在网上看到很多使用 System.Security.Cryptography.RSACryptoServiceProvider 的 C# 加密/解密教程和示例,但我希望能够做的是:

  • 创建 RSA 公钥/私钥对
  • 传输公钥(或为了概念证明,只需将其移动到字符串变量中)
  • 创建一个新的 RSA 加密提供程序并使用公钥加密字符串
  • 将加密的字符串(或数据)传输回原始加密提供者并解密字符串

谁能为我指出有用的资源?

最佳答案

好吧,确实有足够多的例子,但是无论如何,给你

using System;
using System.Security.Cryptography;

namespace RsaCryptoExample
{
  static class Program
  {
    static void Main()
    {
      //lets take a new CSP with a new 2048 bit rsa key pair
      var csp = new RSACryptoServiceProvider(2048);

      //how to get the private key
      var privKey = csp.ExportParameters(true);

      //and the public key ...
      var pubKey = csp.ExportParameters(false);

      //converting the public key into a string representation
      string pubKeyString;
      {
        //we need some buffer
        var sw = new System.IO.StringWriter();
        //we need a serializer
        var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
        //serialize the key into the stream
        xs.Serialize(sw, pubKey);
        //get the string from the stream
        pubKeyString = sw.ToString();
      }

      //converting it back
      {
        //get a stream from the string
        var sr = new System.IO.StringReader(pubKeyString);
        //we need a deserializer
        var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
        //get the object back from the stream
        pubKey = (RSAParameters)xs.Deserialize(sr);
      }

      //conversion for the private key is no black magic either ... omitted

      //we have a public key ... let's get a new csp and load that key
      csp = new RSACryptoServiceProvider();
      csp.ImportParameters(pubKey);

      //we need some data to encrypt
      var plainTextData = "foobar";

      //for encryption, always handle bytes...
      var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(plainTextData);

      //apply pkcs#1.5 padding and encrypt our data 
      var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);

      //we might want a string representation of our cypher text... base64 will do
      var cypherText = Convert.ToBase64String(bytesCypherText);


      /*
       * some transmission / storage / retrieval
       * 
       * and we want to decrypt our cypherText
       */

      //first, get our bytes back from the base64 string ...
      bytesCypherText = Convert.FromBase64String(cypherText);

      //we want to decrypt, therefore we need a csp and load our private key
      csp = new RSACryptoServiceProvider();
      csp.ImportParameters(privKey);

      //decrypt and strip pkcs#1.5 padding
      bytesPlainTextData = csp.Decrypt(bytesCypherText, false);

      //get our original plainText back...
      plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
    }
  }
}

作为旁注:对 Encrypt() 和 Decrypt() 的调用有一个 bool 参数,它在 OAEP 和 PKCS#1.5 填充之间切换……如果 OAEP 在您的情况下可用,您可能想要选择它

关于C# RSA加密/解密带传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17128038/

相关文章:

c# - 你如何在 C# 中使用这个@?

c# - 获取 SortedList 中 2 个键之间所有键的最快方法是什么?

c# - Crystal 报表显示空白页

c - 为什么大多数 c 编译器没有优化此归零代码?

c# - 无法解密 RSA 加密 key

c# - 如何防止ComboBox滚动? C#

c# - 在有或没有下一代加密技术 (CNG) 的情况下使用 ECDiffieHellman

java - 尝试理解RSA加密代码示例

java - ECB 模式下的 RSA 加密

c++ - 无法通过套接字验证消息 RSA 签名方案