C#常用的加密解密方法.docx
《C#常用的加密解密方法.docx》由会员分享,可在线阅读,更多相关《C#常用的加密解密方法.docx(19页珍藏版)》请在冰豆网上搜索。
C#常用的加密解密方法
开篇
C#内置很多加密解密的方法,有MD5,SHA1,base64等。
这里会简单介绍下这几个方法以及用法。
这几个加密解密会分为两类说,一类是只有加密,没有解密类型的MD5,SHA1。
此类加密常用在数据校验。
一类是有加密,有解密类型的base64,DES,RSA。
此类加密常用在数据传输。
数据校验型
MD5
MessageDigestAlgorithmMD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
该算法的文件号为RFC1321(R.Rivest,MITLaboratoryforComputerScienceandRSADataSecurityInc.April1992)。
MD5即Message-DigestAlgorithm5(信息-摘要算法5),用于确保信息传输完整一致。
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
p.s.内容来自XX百科。
MD5主要是用来做数据校验的。
拿网上下载软件来说,有很多软件在下载的时候都会提供一个MD5校验码,就是用来校验软件是否被他人修改过。
还有就是用户账号系统,用户注册后,数据库存储的不是明文密码,而是MD5码。
测试代码:
演示如何获取一个字符串的MD5hash以及校验MD5hash:
usingSystem;
usingSystem.Security.Cryptography;
usingSystem.Text;
namespaceMD5Test
{
classProgram
staticvoidMain(string[]args)
stringsource="HappyBirthday!
";
stringhash=GetMd5Hash(source);
Console.WriteLine("TheMD5hashof"+source+"is:
"+hash);
Console.WriteLine("Verifyingthehash...");
if(VerifyMd5Hash(source,hash))
Console.WriteLine("Thehashesarethesame.");
}
else
Console.WriteLine("Thehashesarenotsame.");
Console.ReadKey();
///
///获取一个字符串的32位16进制字符串格式MD5码
///原字符串
staticstringGetMd5Hash(stringinput)
MD5CryptoServiceProvidermd5Hasher=newMD5CryptoServiceProvider();
byte[]inputBytes=Encoding.Default.GetBytes(input);
byte[]data=md5Hasher.ComputeHash(inputBytes);
StringBuildersBuilder=newStringBuilder();
//将data中的每个字符都转换为16进制的
for(inti=0;i{sBuilder.Append(data[i].ToString("x2"));}returnsBuilder.ToString();}//////验证Md5hash//////原字符串///原字符串的md5码///staticboolVerifyMd5Hash(stringinput,stringhash){stringhashOfInput=GetMd5Hash(input);StringComparercomparer=StringComparer.OrdinalIgnoreCase;if(0==comparer.Compare(hashOfInput,hash)){returntrue;}else{returnfalse;}}}}SHA1安全哈希算法(SecureHashAlgorithm)主要适用于数字签名标准(DigitalSignatureStandardDSS)里面定义的数字签名算法(DigitalSignatureAlgorithmDSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,这时候就会产生不同的消息摘要。SHA1有如下特性:①不可以从消息摘要中复原信息②两个不同的消息不会产生同样的消息摘要,(但会有1x10^48分之一的机率出现相同的消息摘要,一般使用时忽略)。p.s.内容摘自XX百科sha1和md5的用途类似,用来验证数据。测试代码:演示通过sha1获取一个字符串的hash并做验证:usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;namespaceSHA1Test{classProgram{staticvoidMain(string[]args){stringsource="HappyBirthday!";stringhash=GetSha1Hash(source);Console.WriteLine("TheSHA1Hashof"+source+"is:"+hash);Console.WriteLine("Verifyingthehash....");if(VerifySha1Hash(source,hash)){Console.WriteLine("Thehashesarethesame...");}else{Console.WriteLine("TheHashesarenotsame...");}Console.ReadKey();}staticstringGetSha1Hash(stringinput){byte[]inputBytes=Encoding.Default.GetBytes(input);SHA1sha=newSHA1CryptoServiceProvider();byte[]result=sha.ComputeHash(inputBytes);StringBuildersBuilder=newStringBuilder();for(inti=0;i{sBuilder.Append(result[i].ToString("x2"));}returnsBuilder.ToString();}staticboolVerifySha1Hash(stringinput,stringhash){stringhashOfInput=GetSha1Hash(input);StringComparercomparer=StringComparer.OrdinalIgnoreCase;if(0==comparer.Compare(hashOfInput,hash)){returntrue;}else{returnfalse;}}}}加密数据传输这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。base64Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在JavaPersistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTPGETURL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。采用Base64编码具有不可读性,需要解码后才能阅读。p.s.内容摘自XX百科测试代码:usingSystem;usingSystem.Text;namespaceBase64Test{classProgram{staticvoidMain(string[]args){stringsource="HappyBirthday!";stringencryStr=EncryptBase64(source);Console.WriteLine("原数据:"+source);Console.WriteLine("加密后的数据:"+encryStr);stringdecryStr=DecryptBase64(encryStr);Console.WriteLine("解密后的数据:"+decryStr);Console.ReadKey();}//////base64加密/////////StaticstringEncryptBase64(stringinput){byte[]inputBytes=Encoding.UTF8.GetBytes(input);returnConvert.ToBase64String(inputBytes);}//////base64解密/////////staticstringDecryptBase64(stringinput){byte[]inputBytes=Convert.FromBase64String(input);returnEncoding.UTF8.GetString(inputBytes);}}}base64的加密解密规则比较固定,所以破解也容易,在网上找个在线base64解密就可以破解加密后的内容,所以敏感数据不推荐使用base64。DES对称加密算法DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。在某些文献中,作为算法的DES称为数据加密算法(DataEncryptionAlgorithm,DSA),已与作为标准的DES区分开来。P.s.内容摘自XX百科测试代码:usingSystem;usingSystem.IO;usingSystem.Security.Cryptography;usingSystem.Text;namespaceDESTest{classProgram{staticvoidMain(string[]args){stringkey="The_key!";stringsource="HappyBirthday!";Console.WriteLine("Sourcestring:"+source);stringencryptStr=EncryptDES(source,key);Console.WriteLine("Encryptstring:"+encryptStr);stringdecryptStr=DecryptDES(encryptStr,key);Console.WriteLine("Decryptstring:"+decryptStr);Console.ReadKey();}//////进行DES加密//////要加密的字符串///密钥,必须为8位///以Base64格式返回的加密字符串staticstringEncryptDES(stringpToEncrypt,stringsKey){using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){byte[]inputByteArray=Encoding.UTF8.GetBytes(pToEncrypt);des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);System.IO.MemoryStreamms=newSystem.IO.MemoryStream();using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write)){cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();cs.Close();}stringstr=Convert.ToBase64String(ms.ToArray());ms.Close();returnstr;}}staticstringDecryptDES(stringpToDecrypt,stringsKey){byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);MemoryStreamms=newMemoryStream();using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write)){cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();cs.Close();}stringstr=Encoding.UTF8.GetString(ms.ToArray());ms.Close();returnstr;}}}DES加密解密需要提供一个key,双方可以约定一个共同的key使用。RSA非对称加密算法大名鼎鼎的RSA算法->_->,此处没有介绍,自行XX,Google。只说明,RSA需要两把key,即密钥,一个publickey进行加密,一个privatekey用来解密。也可称为公钥,私钥。测试代码:演示如何生成公钥,私钥,以及适用公钥加密,私钥解密。usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;namespaceRSATest{classProgram{staticvoidMain(string[]args){try{UnicodeEncodingbyteConverter=newUnicodeEncoding();byte[]dataToEncrypt=byteConverter.GetBytes("HappyBirthday!");byte[]encryptedData;byte[]decryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){//数据加密获取publickey信息//(usingRSACryptoServiceProvider.ExportParameters(false)encryptedData=EncryptRSA(dataToEncrypt,rsa.ExportParameters(false),false);//数据解密,获取privatekey信息//(usingRSACryptoServiceProvider.ExportParameters(true))decryptedData=DecryptRSA(encryptedData,rsa.ExportParameters(true),false);Console.WriteLine("DecryptedString:"+byteConverter.GetString(decryptedData));}Console.ReadKey();}catch(ArgumentNullException){Console.WriteLine("Encryptionfailed!");}}//////加密数据//////要加密的byte数组/////////staticbyte[]EncryptRSA(byte[]dataToEncrypt,RSAParametersrsaKeyInfo,booldoOAEPadding){try{byte[]encryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){//导入RSAkey信息,这里导入公钥信息rsa.ImportParameters(rsaKeyInfo);//加密传入的byte数组,并指定OAEPpadding//OAEPpadding只可用在微软Windowxp及以后的系统中encryptedData=rsa.Encrypt(dataToEncrypt,doOAEPadding);}returnencryptedData;}catch(CryptographicExceptione){Console.WriteLine(e.Message);returnnull;}}//////解密数据///////////////staticbyte[]DecryptRSA(byte[]dataToDecrypt,RSAParametersrsaKeyInfo,booldoOAEPPadding){try{byte[]decryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){rsa.ImportParameters(rsaKeyInfo);decryptedData=rsa.Decrypt(dataToDecrypt,doOAEPPadding);}returndecryptedData;}catch(CryptographicExceptione){Console.WriteLine(e.Message);returnnull;}}}}使用xml形式的密钥加密解密–生成xml格式的密钥生成的密钥会以xml的格式放在你工程bin\Debug目录下。//////生成RSApublickeyprivatekey///publicstaticvoidGenerateRSAKey(){RSACryptoServiceProviderrsa=new
sBuilder.Append(data[i].ToString("x2"));
returnsBuilder.ToString();
///验证Md5hash
///原字符串的md5码
staticboolVerifyMd5Hash(stringinput,stringhash)
stringhashOfInput=GetMd5Hash(input);
StringComparercomparer=StringComparer.OrdinalIgnoreCase;
if(0==comparer.Compare(hashOfInput,hash))
returntrue;
returnfalse;
SHA1
安全哈希算法(SecureHashAlgorithm)主要适用于数字签名标准(DigitalSignatureStandardDSS)里面定义的数字签名算法(DigitalSignatureAlgorithmDSA)。
对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
在传输的过程中,数据很可能会发生变化,这时候就会产生不同的消息摘要。
SHA1有如下特性:
①不可以从消息摘要中复原信息
②两个不同的消息不会产生同样的消息摘要,(但会有1x10^48分之一的机率出现相同的消息摘要,一般使用时忽略)。
p.s.内容摘自XX百科
sha1和md5的用途类似,用来验证数据。
测试代码:
演示通过sha1获取一个字符串的hash并做验证:
namespaceSHA1Test
stringhash=GetSha1Hash(source);
Console.WriteLine("TheSHA1Hashof"+source+"is:
Console.WriteLine("Verifyingthehash....");
if(VerifySha1Hash(source,hash))
Console.WriteLine("Thehashesarethesame...");
Console.WriteLine("TheHashesarenotsame...");
staticstringGetSha1Hash(stringinput)
SHA1sha=newSHA1CryptoServiceProvider();
byte[]result=sha.ComputeHash(inputBytes);
for(inti=0;i{sBuilder.Append(result[i].ToString("x2"));}returnsBuilder.ToString();}staticboolVerifySha1Hash(stringinput,stringhash){stringhashOfInput=GetSha1Hash(input);StringComparercomparer=StringComparer.OrdinalIgnoreCase;if(0==comparer.Compare(hashOfInput,hash)){returntrue;}else{returnfalse;}}}}加密数据传输这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。base64Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在JavaPersistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTPGETURL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。采用Base64编码具有不可读性,需要解码后才能阅读。p.s.内容摘自XX百科测试代码:usingSystem;usingSystem.Text;namespaceBase64Test{classProgram{staticvoidMain(string[]args){stringsource="HappyBirthday!";stringencryStr=EncryptBase64(source);Console.WriteLine("原数据:"+source);Console.WriteLine("加密后的数据:"+encryStr);stringdecryStr=DecryptBase64(encryStr);Console.WriteLine("解密后的数据:"+decryStr);Console.ReadKey();}//////base64加密/////////StaticstringEncryptBase64(stringinput){byte[]inputBytes=Encoding.UTF8.GetBytes(input);returnConvert.ToBase64String(inputBytes);}//////base64解密/////////staticstringDecryptBase64(stringinput){byte[]inputBytes=Convert.FromBase64String(input);returnEncoding.UTF8.GetString(inputBytes);}}}base64的加密解密规则比较固定,所以破解也容易,在网上找个在线base64解密就可以破解加密后的内容,所以敏感数据不推荐使用base64。DES对称加密算法DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。在某些文献中,作为算法的DES称为数据加密算法(DataEncryptionAlgorithm,DSA),已与作为标准的DES区分开来。P.s.内容摘自XX百科测试代码:usingSystem;usingSystem.IO;usingSystem.Security.Cryptography;usingSystem.Text;namespaceDESTest{classProgram{staticvoidMain(string[]args){stringkey="The_key!";stringsource="HappyBirthday!";Console.WriteLine("Sourcestring:"+source);stringencryptStr=EncryptDES(source,key);Console.WriteLine("Encryptstring:"+encryptStr);stringdecryptStr=DecryptDES(encryptStr,key);Console.WriteLine("Decryptstring:"+decryptStr);Console.ReadKey();}//////进行DES加密//////要加密的字符串///密钥,必须为8位///以Base64格式返回的加密字符串staticstringEncryptDES(stringpToEncrypt,stringsKey){using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){byte[]inputByteArray=Encoding.UTF8.GetBytes(pToEncrypt);des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);System.IO.MemoryStreamms=newSystem.IO.MemoryStream();using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write)){cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();cs.Close();}stringstr=Convert.ToBase64String(ms.ToArray());ms.Close();returnstr;}}staticstringDecryptDES(stringpToDecrypt,stringsKey){byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);MemoryStreamms=newMemoryStream();using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write)){cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();cs.Close();}stringstr=Encoding.UTF8.GetString(ms.ToArray());ms.Close();returnstr;}}}DES加密解密需要提供一个key,双方可以约定一个共同的key使用。RSA非对称加密算法大名鼎鼎的RSA算法->_->,此处没有介绍,自行XX,Google。只说明,RSA需要两把key,即密钥,一个publickey进行加密,一个privatekey用来解密。也可称为公钥,私钥。测试代码:演示如何生成公钥,私钥,以及适用公钥加密,私钥解密。usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;namespaceRSATest{classProgram{staticvoidMain(string[]args){try{UnicodeEncodingbyteConverter=newUnicodeEncoding();byte[]dataToEncrypt=byteConverter.GetBytes("HappyBirthday!");byte[]encryptedData;byte[]decryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){//数据加密获取publickey信息//(usingRSACryptoServiceProvider.ExportParameters(false)encryptedData=EncryptRSA(dataToEncrypt,rsa.ExportParameters(false),false);//数据解密,获取privatekey信息//(usingRSACryptoServiceProvider.ExportParameters(true))decryptedData=DecryptRSA(encryptedData,rsa.ExportParameters(true),false);Console.WriteLine("DecryptedString:"+byteConverter.GetString(decryptedData));}Console.ReadKey();}catch(ArgumentNullException){Console.WriteLine("Encryptionfailed!");}}//////加密数据//////要加密的byte数组/////////staticbyte[]EncryptRSA(byte[]dataToEncrypt,RSAParametersrsaKeyInfo,booldoOAEPadding){try{byte[]encryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){//导入RSAkey信息,这里导入公钥信息rsa.ImportParameters(rsaKeyInfo);//加密传入的byte数组,并指定OAEPpadding//OAEPpadding只可用在微软Windowxp及以后的系统中encryptedData=rsa.Encrypt(dataToEncrypt,doOAEPadding);}returnencryptedData;}catch(CryptographicExceptione){Console.WriteLine(e.Message);returnnull;}}//////解密数据///////////////staticbyte[]DecryptRSA(byte[]dataToDecrypt,RSAParametersrsaKeyInfo,booldoOAEPPadding){try{byte[]decryptedData;using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider()){rsa.ImportParameters(rsaKeyInfo);decryptedData=rsa.Decrypt(dataToDecrypt,doOAEPPadding);}returndecryptedData;}catch(CryptographicExceptione){Console.WriteLine(e.Message);returnnull;}}}}使用xml形式的密钥加密解密–生成xml格式的密钥生成的密钥会以xml的格式放在你工程bin\Debug目录下。//////生成RSApublickeyprivatekey///publicstaticvoidGenerateRSAKey(){RSACryptoServiceProviderrsa=new
sBuilder.Append(result[i].ToString("x2"));
staticboolVerifySha1Hash(stringinput,stringhash)
stringhashOfInput=GetSha1Hash(input);
加密数据传输
这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。
base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。
例如,在JavaPersistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTPGETURL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。
采用Base64编码具有不可读性,需要解码后才能阅读。
namespaceBase64Test{
classProgram{
staticvoidMain(string[]args){
stringencryStr=EncryptBase64(source);
Console.WriteLine("原数据:
"+source);
Console.WriteLine("加密后的数据:
"+encryStr);
stringdecryStr=DecryptBase64(encryStr);
Console.WriteLine("解密后的数据:
"+decryStr);Console.ReadKey();}
///base64加密
StaticstringEncryptBase64(stringinput){
byte[]inputBytes=Encoding.UTF8.GetBytes(input);
returnConvert.ToBase64String(inputBytes);
///base64解密
staticstringDecryptBase64(stringinput){
byte[]inputBytes=Convert.FromBase64String(input);
returnEncoding.UTF8.GetString(inputBytes);
base64的加密解密规则比较固定,所以破解也容易,在网上找个在线base64解密就可以破解加密后的内容,所以敏感数据不推荐使用base64。
DES
对称加密算法
DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),
并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
在某些文献中,作为算法的DES称为数据加密算法(DataEncryptionAlgorithm,DSA),已与作为标准的DES区分开来。
P.s.内容摘自XX百科
usingSystem.IO;
namespaceDESTest{
stringkey="The_key!
Console.WriteLine("Sourcestring:
stringencryptStr=EncryptDES(source,key);
Console.WriteLine("Encryptstring:
"+encryptStr);
stringdecryptStr=DecryptDES(encryptStr,key);
Console.WriteLine("Decryptstring:
"+decryptStr);
}///
///进行DES加密
///要加密的字符串
///密钥,必须为8位
///以Base64格式返回的加密字符串
staticstringEncryptDES(stringpToEncrypt,stringsKey){
using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){
byte[]inputByteArray=Encoding.UTF8.GetBytes(pToEncrypt);
des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write)){
cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();
cs.Close();
stringstr=Convert.ToBase64String(ms.ToArray());
ms.Close();
returnstr;
staticstringDecryptDES(stringpToDecrypt,stringsKey){
byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);
MemoryStreamms=newMemoryStream();
using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write)){
cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();
stringstr=Encoding.UTF8.GetString(ms.ToArray());
DES加密解密需要提供一个key,双方可以约定一个共同的key使用。
RSA
非对称加密算法
大名鼎鼎的RSA算法->_->,此处没有介绍,自行XX,Google。
只说明,RSA需要两把key,即密钥,一个publickey进行加密,一个privatekey用来解密。
也可称为公钥,私钥。
演示如何生成公钥,私钥,以及适用公钥加密,私钥解密。
namespaceRSATest
try
UnicodeEncodingbyteConverter=newUnicodeEncoding();
byte[]dataToEncrypt=byteConverter.GetBytes("HappyBirthday!
");
byte[]encryptedData;
byte[]decryptedData;
using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider())
//数据加密获取publickey信息
//(usingRSACryptoServiceProvider.ExportParameters(false)
encryptedData=EncryptRSA(dataToEncrypt,rsa.ExportParameters(false),false);
//数据解密,获取privatekey信息
//(usingRSACryptoServiceProvider.ExportParameters(true))
decryptedData=DecryptRSA(encryptedData,rsa.ExportParameters(true),false);
Console.WriteLine("DecryptedString:
"+byteConverter.GetString(decryptedData));
catch(ArgumentNullException)
Console.WriteLine("Encryptionfailed!
///加密数据
///要加密的byte数组
staticbyte[]EncryptRSA(byte[]dataToEncrypt,RSAParametersrsaKeyInfo,booldoOAEPadding)
//导入RSAkey信息,这里导入公钥信息
rsa.ImportParameters(rsaKeyInfo);
//加密传入的byte数组,并指定OAEPpadding
//OAEPpadding只可用在微软Windowxp及以后的系统中
encryptedData=rsa.Encrypt(dataToEncrypt,doOAEPadding);
returnencryptedData;
catch(CryptographicExceptione)
Console.WriteLine(e.Message);
returnnull;
///解密数据
staticbyte[]DecryptRSA(byte[]dataToDecrypt,RSAParametersrsaKeyInfo,booldoOAEPPadding)
decryptedData=rsa.Decrypt(dataToDecrypt,doOAEPPadding);
returndecryptedData;
使用xml形式的密钥加密解密
–生成xml格式的密钥
生成的密钥会以xml的格式放在你工程bin\Debug目录下。
///生成RSApublickeyprivatekey
publicstaticvoidGenerateRSAKey(){
RSACryptoServiceProviderrsa=new
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1