天天看点

C#实现RSA加密和解密详解

RSA加密解密源码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;

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 =

"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)

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

byte[] dataToEncrypt =

ByteConverter.GetBytes(toEncryptString);

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

//(using RSACryptoServiceProvider.ExportParameters(false),

encryptedData = RSAEncrypt(

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

string base64code = Convert.ToBase64String(encryptedData);

return base64code;

//Catch this exception in case the encryption did

//not succeed.

staticprivatebyte[] RSAEncrypt(

byte[] DataToEncrypt,

RSAParameters RSAKeyInfo,

bool DoOAEPPadding)

//Create a new instance of 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,

//Import the RSA Key information. This needs

//to include the private key information.

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

return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);

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

    "TO96dB3gEurM2UQDDVGrZoe6RcAVTxAqDDf5L"+

    "wPycZwtNOx3Cfy44/D5Mj86koPew5soFIz9sx"+

    "PAHRF5hcqJoG+q+UfUYTHYCsMH2cnqGVtnQiE"+

    "/PMRMmY0RwEfMIo+TDpq3QyO03MaEsDGf13sP"+

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

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

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

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

        byte[] dataToEncrypt =

            ByteConverter.GetBytes(toEncryptString);

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

        //(using RSACryptoServiceProvider.ExportParameters(false),

        encryptedData = RSAEncrypt(

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

        string base64code = Convert.ToBase64String(encryptedData);

        return base64code;

        //Catch this exception in case the encryption did

        //not succeed.

    byte[] DataToEncrypt,

    RSAParameters RSAKeyInfo,

    bool DoOAEPPadding)

        //Create a new instance of 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;

    byte[] DataToDecrypt,

        //Import the RSA Key information. This needs

        //to include the private key information.

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

        return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);

 测试代码:

        static void Main(string[] args)

        {

            string encodeString = MyRSA.Encrypt("1234567");

            Console.WriteLine(encodeString);

            string decode = MyRSA.Decrypt(encodeString);

            Console.WriteLine(decode);

            Console.ReadLine();

        }

继续阅读