zoukankan      html  css  js  c++  java
  • C#实现RSA加密和解密详解

    项目要求,生成一个private key 和 public key ,用 Public Key 加密,用Private key 解密,我是这样实现的,

    希望对有这方面需求朋友的一个帮助.

      

      源代码如下:

    1.生成一对keys:

              /// <summary>
            /// generate private key and public key arr[0] for private key arr[1] for public key
            /// </summary>
            /// <returns></returns>
            public static string[] GenerateKeys()
            {
                string[] sKeys = new String[2];
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                sKeys[0] = rsa.ToXmlString(true);
                sKeys[1] = rsa.ToXmlString(false);
                return sKeys;
            } 

    2.加密:

          /// <summary>
            /// RSA Encrypt
            /// </summary>
           /// <param name="sSource" >Source string</param>
            /// <param name="sPublicKey" >public key</param>
            /// <returns></returns>
            public static  string EncryptString(string sSource,string sPublicKey)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                string plaintext = sSource;
                rsa.FromXmlString(sPublicKey);
                byte[] cipherbytes;
                byte[] byteEn = rsa.Encrypt(Encoding.UTF8.GetBytes("a"), false);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintext), false);

                StringBuilder sbString = new StringBuilder();
                for (int i = 0; i < cipherbytes.Length; i++)
                {
                    sbString.Append(cipherbytes[i] + ",");
                }

    3. 解密:

         /// <summary>
            /// RSA Decrypt
            /// </summary>
            /// <param name="sSource">Source string</param>
            /// <param name="sPrivateKey">Private Key</param>
            /// <returns></returns>
            public static string DecryptString(String sSource, string sPrivateKey)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(sPrivateKey);
                byte[] byteEn = rsa.Encrypt(Encoding.UTF8.GetBytes("a"), false);
                string[] sBytes = sSource.Split(',');

                for (int j = 0; j < sBytes.Length; j++)
                {
                    if (sBytes[j] != "")
                    {
                        byteEn[j] = Byte.Parse(sBytes[j]);
                    }
                }
                byte[] plaintbytes = rsa.Decrypt(byteEn, false);
                return  Encoding.UTF8.GetString(plaintbytes);
            }
                return  sbString.ToString();
            }

    --------------------------------------------------------------------

    RSA加密解密源码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;

    namespace MyRSA

    namespace MyRSA

    {

    publicclass MyRSA

    {



    privatestaticstring publicKey =

       
    "<RSAKeyValue><Modulus>6CdsXgYOyya/yQH"+

       
    "TO96dB3gEurM2UQDDVGrZoe6RcAVTxAqDDf5L"+

       
    "wPycZwtNOx3Cfy44/D5Mj86koPew5soFIz9sx"+

       
    "PAHRF5hcqJoG+q+UfUYTHYCsMH2cnqGVtnQiE"+

       
    "/PMRMmY0RwEfMIo+TDpq3QyO03MaEsDGf13sP"+

       
    "w9YRXiac=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

    privatestaticstring privateKey =

       
    "<RSAKeyValue><Modulus>6CdsXgYOyya/yQH"+

       
    "TO96dB3gEurM2UQDDVGrZoe6RcAVTxAqDDf5L"+

       
    "wPycZwtNOx3Cfy44/D5Mj86koPew5soFIz9sx"+

       
    "PAHRF5hcqJoG+q+UfUYTHYCsMH2cnqGVtnQiE"+

       
    "/PMRMmY0RwEfMIo+TDpq3QyO03MaEsDGf13sP"+

       
    "w9YRXiac=</Modulus><Exponent>AQAB</Exponent>"+

       
    "<P>/aoce2r6tonjzt1IQI6FM4ysR40j/gKvt4d"+

       
    "L411pUop1Zg61KvCm990M4uN6K8R/DUvAQdrRd"+

       
    "VgzvvAxXD7ESw==</P><Q>6kqclrEunX/fmOle"+

       
    "VTxG4oEpXY4IJumXkLpylNR3vhlXf6ZF9obEpG"+

       
    "lq0N7sX2HBxa7T2a0WznOAb0si8FuelQ==</Q>"+

       
    "<DP>3XEvxB40GD5v/Rr4BENmzQW1MBFqpki6FU"+

       
    "GrYiUd2My+iAW26nGDkUYMBdYHxUWYlIbYo6Te"+

       
    "zc3d/oW40YqJ2Q==</DP><DQ>LK0XmQCmY/ArY"+

       
    "gw2Kci5t51rluRrl4f5l+aFzO2K+9v3PGcndjA"+

       
    "StUtIzBWGO1X3zktdKGgCLlIGDrLkMbM21Q==</DQ><InverseQ>"+

       
    "GqC4Wwsk2fdvJ9dmgYlej8mTDBWg0Wm6aqb5kjn"+

       
    "cWK6WUa6CfD+XxfewIIq26+4Etm2A8IAtRdwPl4"+

       
    "aPjSfWdA==</InverseQ><D>a1qfsDMY8DSxB2D"+

       
    "Cr7LX5rZHaZaqDXdO3GC01z8dHjI4dDVwOS5ZFZ"+

       
    "s7MCN3yViPsoRLccnVWcLzOkSQF4lgKfTq3IH40"+

       
    "H5N4gg41as9GbD0g9FC3n5IT4VlVxn9ZdW+WQry"+

       
    "oHdbiIAiNpFKxL/DIEERur4sE1Jt9VdZsH24CJE=</D></RSAKeyValue>";



    staticpublicstring Decrypt(string base64code)

    {

       
    try

       
    {



           
    //Create a UnicodeEncoder to convert between byte array and string.

            UnicodeEncoding ByteConverter =new UnicodeEncoding();



           
    //Create a new instance of RSACryptoServiceProvider to generate

           
    //public and private key data.

            RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();

            RSA.FromXmlString(privateKey);



           
    byte[] encryptedData;

           
    byte[] decryptedData;

            encryptedData
    = Convert.FromBase64String(base64code);



           
    //Pass the data to DECRYPT, the private key information

           
    //(using RSACryptoServiceProvider.ExportParameters(true),

           
    //and a boolean flag specifying no OAEP padding.

            decryptedData = RSADecrypt(

                encryptedData, RSA.ExportParameters(
    true), false);



           
    //Display the decrypted plaintext to the console.

            return ByteConverter.GetString(decryptedData);

        }


       
    catch (Exception exc)

       
    {

           
    //Exceptions.LogException(exc);

            Console.WriteLine(exc.Message);

           
    return"";

        }


    }




    staticpublicstring Encrypt(string toEncryptString)

    {

       
    try

       
    {

           
    //Create a UnicodeEncoder to convert between byte array and string.

            UnicodeEncoding ByteConverter =new UnicodeEncoding();



           
    //Create byte arrays to hold original, encrypted, and decrypted data.

            byte[] dataToEncrypt =

                ByteConverter.GetBytes(toEncryptString);

           
    byte[] encryptedData;

           
    byte[] decryptedData;



           
    //Create a new instance of RSACryptoServiceProvider to generate

           
    //public and private key data.

            RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();



            RSA.FromXmlString(privateKey);



           
    //Pass the data to ENCRYPT, the public key information

           
    //(using RSACryptoServiceProvider.ExportParameters(false),

           
    //and a boolean flag specifying no OAEP padding.

            encryptedData = RSAEncrypt(

                dataToEncrypt, RSA.ExportParameters(
    false), false);



           
    string base64code = Convert.ToBase64String(encryptedData);

           
    return base64code;

        }


       
    catch (Exception exc)

       
    {

           
    //Catch this exception in case the encryption did

           
    //not succeed.

           
    //Exceptions.LogException(exc);

            Console.WriteLine(exc.Message);

           
    return"";

        }








    }




    staticprivatebyte[] RSAEncrypt(

       
    byte[] DataToEncrypt,

        RSAParameters RSAKeyInfo,

       
    bool DoOAEPPadding)

    {

       
    try

       
    {

           
    //Create a new instance of RSACryptoServiceProvider.

            RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();



           
    //Import the RSA Key information. This only needs

           
    //toinclude the public key information.

            RSA.ImportParameters(RSAKeyInfo);



           
    //Encrypt the passed byte array and specify OAEP padding. 

           
    //OAEP padding is only available on Microsoft Windows XP or

           
    //later. 

            return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);

        }


       
    //Catch and display a CryptographicException 

       
    //to the console.

        catch (CryptographicException e)

       
    {

           
    //Exceptions.LogException(e);

            Console.WriteLine(e.Message);



           
    returnnull;

        }




    }




    staticprivatebyte[] RSADecrypt(

       
    byte[] DataToDecrypt,

        RSAParameters RSAKeyInfo,

       
    bool DoOAEPPadding)

    {

       
    try

       
    {

           
    //Create a new instance of RSACryptoServiceProvider.

            RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();



           
    //Import the RSA Key information. This needs

           
    //to include the private key information.

            RSA.ImportParameters(RSAKeyInfo);



           
    //Decrypt the passed byte array and specify OAEP padding. 

           
    //OAEP padding is only available on Microsoft Windows XP or

           
    //later. 

            return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);

        }


       
    //Catch and display a CryptographicException 

       
    //to the console.

        catch (CryptographicException e)

       
    {

           
    //Exceptions.LogException(e);

            Console.WriteLine(e.Message);



           
    returnnull;

        }


    }


    }


    }

     测试代码:

            static void Main(string[] args)
            {
                
    string encodeString = MyRSA.Encrypt("1234567");
                Console.WriteLine(encodeString);


                
    string decode = MyRSA.Decrypt(encodeString);
                Console.WriteLine(decode);

                Console.ReadLine();
            }
  • 相关阅读:
    c# 泛型委托
    c# 用户自定义转换
    c# 溢出上下文检测
    c# 接口相同方法申明使用
    c# 事件的订阅发布Demo
    c# 匿名方法几种表现形式
    c# 数组协变
    c# 交错数组
    C# 位运算详解
    ABAP 7.4 新语法-内嵌生命和内表操作(转)
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/3641638.html
Copyright © 2011-2022 走看看