在C#程序中,大家可能比較熟悉的方式是md5加密解密方式,對RSA可能并不是很熟悉, 下面就說一下RSA加密和解密的算法:
?
using?System;
using?System.Security.Cryptography;
using?System.Text;
class?RSACSPSample
{
????static?void?Main()
????{
????????try
????????{
????????????string?str_Plain_Text?=?"How?are?you?How?are?you?How?are?you?How?are?you?=-popopolA";
????????????Console.WriteLine("明文:"?+?str_Plain_Text);
????????????Console.WriteLine("長度:"?+?str_Plain_Text.Length.ToString());
????????????Console.WriteLine();
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????string?str_Public_Key;
????????????string?str_Private_Key;
????????????string?str_Cypher_Text?=?RSA_Encrypt(str_Plain_Text,?out?str_Public_Key,out?str_Private_Key);
????????????Console.WriteLine("密文:"?+?str_Cypher_Text);
????????????Console.WriteLine("公鑰:"?+?str_Public_Key);
????????????Console.WriteLine("私鑰:"?+?str_Private_Key);
????????????string?str_Plain_Text2?=?RSA_Decrypt(str_Cypher_Text,?str_Private_Key);
????????????Console.WriteLine("解密:"?+?str_Plain_Text2);
????????????Console.WriteLine();
????????}
????????catch?(ArgumentNullException)
????????{
????????????Console.WriteLine("Encryption?failed.");
????????}
????}
????//RSA加密,隨機生成公私鑰對并作為出參返回
????static?public?string?RSA_Encrypt(string?str_Plain_Text,?out?string?str_Public_Key,?out?string?str_Private_Key)
????{
????????str_Public_Key?=?"";
????????str_Private_Key?=?"";
????????UnicodeEncoding?ByteConverter?=?new?UnicodeEncoding();
????????byte[]?DataToEncrypt?=?ByteConverter.GetBytes(str_Plain_Text);
????????try
????????{
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????str_Public_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(false));
????????????str_Private_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(true));
??????????
????????????//OAEP?padding?is?only?available?on?Microsoft?Windows?XP?or?later.?
????????????byte[]?bytes_Cypher_Text?=?RSA.Encrypt(DataToEncrypt,?false);
????????????str_Public_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(false));
????????????str_Private_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(true));
????????????string?str_Cypher_Text?=?Convert.ToBase64String(bytes_Cypher_Text);
????????????return?str_Cypher_Text;
????????}
????????catch?(CryptographicException?e)
????????{
????????????Console.WriteLine(e.Message);
????????????return?null;
????????}
????}
????//RSA解密
????static?public?string?RSA_Decrypt(string?str_Cypher_Text,?string?str_Private_Key)
????{
????????byte[]?DataToDecrypt?=?Convert.FromBase64String(str_Cypher_Text);
????????try
????????{
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????//RSA.ImportParameters(RSAKeyInfo);
????????????byte[]?bytes_Public_Key?=?Convert.FromBase64String(str_Private_Key);
????????????RSA.ImportCspBlob(bytes_Public_Key);
???????????
????????????//OAEP?padding?is?only?available?on?Microsoft?Windows?XP?or?later.?
????????????byte[]?bytes_Plain_Text?=?RSA.Decrypt(DataToDecrypt,?false);
????????????UnicodeEncoding?ByteConverter?=?new?UnicodeEncoding();
????????????string?str_Plain_Text?=?ByteConverter.GetString(bytes_Plain_Text);
????????????return?str_Plain_Text;
????????}
????????catch?(CryptographicException?e)
????????{
????????????Console.WriteLine(e.ToString());
????????????return?null;
????????}
????}
using?System.Security.Cryptography;
using?System.Text;
class?RSACSPSample
{
????static?void?Main()
????{
????????try
????????{
????????????string?str_Plain_Text?=?"How?are?you?How?are?you?How?are?you?How?are?you?=-popopolA";
????????????Console.WriteLine("明文:"?+?str_Plain_Text);
????????????Console.WriteLine("長度:"?+?str_Plain_Text.Length.ToString());
????????????Console.WriteLine();
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????string?str_Public_Key;
????????????string?str_Private_Key;
????????????string?str_Cypher_Text?=?RSA_Encrypt(str_Plain_Text,?out?str_Public_Key,out?str_Private_Key);
????????????Console.WriteLine("密文:"?+?str_Cypher_Text);
????????????Console.WriteLine("公鑰:"?+?str_Public_Key);
????????????Console.WriteLine("私鑰:"?+?str_Private_Key);
????????????string?str_Plain_Text2?=?RSA_Decrypt(str_Cypher_Text,?str_Private_Key);
????????????Console.WriteLine("解密:"?+?str_Plain_Text2);
????????????Console.WriteLine();
????????}
????????catch?(ArgumentNullException)
????????{
????????????Console.WriteLine("Encryption?failed.");
????????}
????}
????//RSA加密,隨機生成公私鑰對并作為出參返回
????static?public?string?RSA_Encrypt(string?str_Plain_Text,?out?string?str_Public_Key,?out?string?str_Private_Key)
????{
????????str_Public_Key?=?"";
????????str_Private_Key?=?"";
????????UnicodeEncoding?ByteConverter?=?new?UnicodeEncoding();
????????byte[]?DataToEncrypt?=?ByteConverter.GetBytes(str_Plain_Text);
????????try
????????{
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????str_Public_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(false));
????????????str_Private_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(true));
??????????
????????????//OAEP?padding?is?only?available?on?Microsoft?Windows?XP?or?later.?
????????????byte[]?bytes_Cypher_Text?=?RSA.Encrypt(DataToEncrypt,?false);
????????????str_Public_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(false));
????????????str_Private_Key?=?Convert.ToBase64String(RSA.ExportCspBlob(true));
????????????string?str_Cypher_Text?=?Convert.ToBase64String(bytes_Cypher_Text);
????????????return?str_Cypher_Text;
????????}
????????catch?(CryptographicException?e)
????????{
????????????Console.WriteLine(e.Message);
????????????return?null;
????????}
????}
????//RSA解密
????static?public?string?RSA_Decrypt(string?str_Cypher_Text,?string?str_Private_Key)
????{
????????byte[]?DataToDecrypt?=?Convert.FromBase64String(str_Cypher_Text);
????????try
????????{
????????????RSACryptoServiceProvider?RSA?=?new?RSACryptoServiceProvider();
????????????//RSA.ImportParameters(RSAKeyInfo);
????????????byte[]?bytes_Public_Key?=?Convert.FromBase64String(str_Private_Key);
????????????RSA.ImportCspBlob(bytes_Public_Key);
???????????
????????????//OAEP?padding?is?only?available?on?Microsoft?Windows?XP?or?later.?
????????????byte[]?bytes_Plain_Text?=?RSA.Decrypt(DataToDecrypt,?false);
????????????UnicodeEncoding?ByteConverter?=?new?UnicodeEncoding();
????????????string?str_Plain_Text?=?ByteConverter.GetString(bytes_Plain_Text);
????????????return?str_Plain_Text;
????????}
????????catch?(CryptographicException?e)
????????{
????????????Console.WriteLine(e.ToString());
????????????return?null;
????????}
????}
}?