Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带传输的C#RSA加密/解密_C#_Cryptography_Rsa - Fatal编程技术网

带传输的C#RSA加密/解密

带传输的C#RSA加密/解密,c#,cryptography,rsa,C#,Cryptography,Rsa,我在网上看到了大量使用System.Security.Cryptography.RSACryptServiceProvider的C#加密/解密教程和示例,但我希望能够做到: 创建RSA公钥/私钥对 传输公钥(或者为了概念验证,只需在字符串变量中移动它) 创建新的RSA加密提供程序并使用公钥加密字符串 将加密字符串(或数据)传输回原始加密提供程序并解密该字符串 有人能给我指出一个有用的资源吗?关于这一点,确实有足够的例子,但不管怎样,给你 using System; using System.

我在网上看到了大量使用System.Security.Cryptography.RSACryptServiceProvider的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在您的情况下可用,您可能需要选择它

公共静态字符串加密(string strText)
public static string Encryption(string strText)
        {
            var publicKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

            var testData = Encoding.UTF8.GetBytes(strText);

            using (var rsa = new RSACryptoServiceProvider(1024))
            {
                try
                {
                    // client encrypting data with public key issued by server                    
                    rsa.FromXmlString(publicKey.ToString());

                    var encryptedData = rsa.Encrypt(testData, true);

                    var base64Encrypted = Convert.ToBase64String(encryptedData);

                    return base64Encrypted;
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
        }

        public static string Decryption(string strText)
        {
            var privateKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent><P>/aULPE6jd5IkwtWXmReyMUhmI/nfwfkQSyl7tsg2PKdpcxk4mpPZUdEQhHQLvE84w2DhTyYkPHCtq/mMKE3MHw==</P><Q>3WV46X9Arg2l9cxb67KVlNVXyCqc/w+LWt/tbhLJvV2xCF/0rWKPsBJ9MC6cquaqNPxWWEav8RAVbmmGrJt51Q==</Q><DP>8TuZFgBMpBoQcGUoS2goB4st6aVq1FcG0hVgHhUI0GMAfYFNPmbDV3cY2IBt8Oj/uYJYhyhlaj5YTqmGTYbATQ==</DP><DQ>FIoVbZQgrAUYIHWVEYi/187zFd7eMct/Yi7kGBImJStMATrluDAspGkStCWe4zwDDmdam1XzfKnBUzz3AYxrAQ==</DQ><InverseQ>QPU3Tmt8nznSgYZ+5jUo9E0SfjiTu435ihANiHqqjasaUNvOHKumqzuBZ8NRtkUhS6dsOEb8A2ODvy7KswUxyA==</InverseQ><D>cgoRoAUpSVfHMdYXW9nA3dfX75dIamZnwPtFHq80ttagbIe4ToYYCcyUz5NElhiNQSESgS5uCgNWqWXt5PnPu4XmCXx6utco1UVH8HGLahzbAnSy6Cj3iUIQ7Gj+9gQ7PkC434HTtHazmxVgIR5l56ZjoQ8yGNCPZnsdYEmhJWk=</D></RSAKeyValue>";

            var testData = Encoding.UTF8.GetBytes(strText);

            using (var rsa = new RSACryptoServiceProvider(1024))
            {
                try
                {                    
                    var base64Encrypted = strText;

                    // server decrypting data with private key                    
                    rsa.FromXmlString(privateKey);

                    var resultBytes = Convert.FromBase64String(base64Encrypted);
                    var decryptedBytes = rsa.Decrypt(resultBytes, true);
                    var decryptedData = Encoding.UTF8.GetString(decryptedBytes);
                    return decryptedData.ToString();
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
        }
{ var publicKey=“21wEnTU+MCD2W0LFO1GV4RTCSWSSQJQTNA6GIO05AOKV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/OGX9HTTZXYWOEQDHDBLOF3E75D9N2F0ZVF6ITB4CI7J6FMS=AQAB”; var testData=Encoding.UTF8.GetBytes(strText); 使用(var rsa=new RSACryptoServiceProvider(1024)) { 尝试 { //客户端使用服务器颁发的公钥加密数据 rsa.FromXmlString(publicKey.ToString()); var encryptedData=rsa.Encrypt(testData,true); var base64Encrypted=Convert.ToBase64String(encryptedData); 返回base64加密; } 最后 { rsa.PersistKeyInCsp=false; } } } 公共静态字符串解密(字符串strText) { var privateKey="2.文中给出了一个简单的数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,这个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个数字,一个CF/0rWKPsBJ9MC6cquaqNPxWWEav8RAVbm(8)管理者(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q(8)Q)Q(8)Q(8)Q(8)Q)Q(8)Q(8)Q)Q(8)Q(8)Q(8)Q(8)Q)Q(8)Q(8)Q(8)Q)Q(8)Q(8)G(8)G(8)Q)G(8)G(8)Q)G(8)G(8)B)G)是一)是一(8)是一个(7)是一个中国政府的一个(7)是一个(7)是一个(7)是一个(7)是一个(7)是一个(7)是一个(7)是一个(7)的,一个LHINQSESGS5UCGNwqwxt5pnpu4xmcxx6utco1uvh8glahzbansy6cj3iuiq7gj+9gQ7PkC434HTtHazmxVgIR5l56ZjoQ8yGNCPZnsdYEmhJWk=“; var testData=Encoding.UTF8.GetBytes(strText); 使用(var rsa=new RSACryptoServiceProvider(1024)) { 尝试 { var base64Encrypted=strText; //服务器使用私钥解密数据 rsa.FromXmlString(privateKey); var resultBytes=Convert.FromBase64String(base64Encrypted); var decryptedBytes=rsa.Decrypt(resultBytes,true); var decryptedData=Encoding.UTF8.GetString(decryptedBytes); 返回decryptedData.ToString(); } 最后 { rsa.PersistKeyInCsp=false; } } }
老实说,我很难实现它,因为我搜索过的教程中几乎没有显示将密钥写入文件的内容。公认的答案是“很好”“。但对我来说,我必须改进它,以便将两个密钥保存到两个单独的文件中。我已经写了一个助手类,所以你们只需要复制并粘贴它。希望这对lol有帮助

using Microsoft.Win32;
using System;
using System.IO;
using System.Security.Cryptography;

namespace RsaCryptoExample
{
    class RSAFileHelper
    {
        readonly string pubKeyPath = "public.key";//change as needed
        readonly string priKeyPath = "private.key";//change as needed
        public void MakeKey()
        {
            //lets take a new CSP with a new 2048 bit rsa key pair
            RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);

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

            //and the public key ...
            RSAParameters pubKey = csp.ExportParameters(false);
            //converting the public key into a string representation
            string pubKeyString;
            {
                //we need some buffer
                var sw = new 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();
                File.WriteAllText(pubKeyPath, pubKeyString);
            }
            string privKeyString;
            {
                //we need some buffer
                var sw = new StringWriter();
                //we need a serializer
                var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
                //serialize the key into the stream
                xs.Serialize(sw, privKey);
                //get the string from the stream
                privKeyString = sw.ToString();
                File.WriteAllText(priKeyPath, privKeyString);
            }
        }
        public void EncryptFile(string filePath)
        {
            //converting the public key into a string representation
            string pubKeyString;
            {
                using (StreamReader reader = new StreamReader(pubKeyPath)){pubKeyString = reader.ReadToEnd();}
            }
            //get a stream from the string
            var sr = new StringReader(pubKeyString);

            //we need a deserializer
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));

            //get the object back from the stream
            RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
            csp.ImportParameters((RSAParameters)xs.Deserialize(sr));
            byte[] bytesPlainTextData = File.ReadAllBytes(filePath);

            //apply pkcs#1.5 padding and encrypt our data 
            var bytesCipherText = csp.Encrypt(bytesPlainTextData, false);
            //we might want a string representation of our cypher text... base64 will do
            string encryptedText = Convert.ToBase64String(bytesCipherText);
            File.WriteAllText(filePath,encryptedText);
        }
        public void DecryptFile(string filePath)
        {
            //we want to decrypt, therefore we need a csp and load our private key
            RSACryptoServiceProvider csp = new RSACryptoServiceProvider();

            string privKeyString;
            {
                privKeyString = File.ReadAllText(priKeyPath);
                //get a stream from the string
                var sr = new StringReader(privKeyString);
                //we need a deserializer
                var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
                //get the object back from the stream
                RSAParameters privKey = (RSAParameters)xs.Deserialize(sr);
                csp.ImportParameters(privKey);
            }
            string encryptedText;
            using (StreamReader reader = new StreamReader(filePath)) { encryptedText = reader.ReadToEnd(); }
            byte[] bytesCipherText = Convert.FromBase64String(encryptedText);

            //decrypt and strip pkcs#1.5 padding
            byte[] bytesPlainTextData = csp.Decrypt(bytesCipherText, false);

            //get our original plainText back...
            File.WriteAllBytes(filePath, bytesPlainTextData);
        }
    }
}

出于示例目的,我将分享我的非常简单的代码。希望它能帮助像我这样的人搜索快速代码参考。 我的目标是从后端接收rsa签名,然后使用公钥对输入字符串进行验证,并在本地存储以备将来的定期验证。 以下是用于签名验证的主要部分:

        ...
        var signature = Get(url); // base64_encoded signature received from server
        var inputtext= "inputtext"; // this is main text signature was created for
        bool result = VerifySignature(inputtext, signature);
        ...

    private bool VerifySignature(string input, string signature)
    {
        var result = false;
        using (var cps=new RSACryptoServiceProvider())
        {
            // converting input and signature to Bytes Arrays to pass to VerifyData rsa method to verify inputtext was signed using privatekey corresponding to public key we have below
            byte[] inputtextBytes = Encoding.UTF8.GetBytes(input);
            byte[] signatureBytes  = Convert.FromBase64String(signature);

            cps.FromXmlString("<RSAKeyValue><Modulus>....</Modulus><Exponent>....</Exponent></RSAKeyValue>"); // xml formatted publickey
            result = cps.VerifyData(inputtextBytes , new SHA1CryptoServiceProvider(), signatureBytes  );
        }

        return result;
    }
。。。
var signature=Get(url);//从服务器接收的base64_编码签名
var inputtext=“inputtext”//这是为创建的主文本签名
bool结果=验证签名(输入文本,签名);
...
私有布尔验证签名(字符串输入,字符串签名)
{
var结果=假;
使用(var cps=new rsacryptserviceprovider())
{
//将输入和签名转换为字节数组以传递给VerifyData rsa方法,以验证inputtext是使用与下面的公钥对应的privatekey签名的
byte[]inputExtBytes=Encoding.UTF8.GetBytes(输入);
byte[]signatureBytes=Convert.FromBase64String(签名);
cps.FromXmlString(“…”);//xml格式的公钥
结果=cps.VerifyData(InputExtBytes,新的SHA1CryptoServiceProvider(),signatureBytes);
}
返回结果;
}

您能否指出一个具体的教程,该教程解释了C#中RSA的加密和解密,但没有满足您的具体需求?我得说它们很直截了当,从你的问题来看,我不清楚你对哪一部分有问题。非常感谢你,先生!我会投票给你,但我需要15个代表。当我这样做的时候,我会记住你的!:)@传输:如果它回答你的问题,请考虑接受答案。有没有算法可以在保证相同安全性的同时缩短它?(最好只包含数字和大写字母)@Sepherm RSA不打算加密大量数据。。。你应该考虑使用对称C。