C#常用的加密解密方法.docx
- 文档编号:30349022
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:19
- 大小:26.50KB
C#常用的加密解密方法.docx
《C#常用的加密解密方法.docx》由会员分享,可在线阅读,更多相关《C#常用的加密解密方法.docx(19页珍藏版)》请在冰豆网上搜索。
C#常用的加密解密方法
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 /// /// /// /// 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; } } } } 加密数据传输 这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。 base64 Base64是网络上最常见的用于传输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加密 /// /// /// /// 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! "); } } /// ///加密数据 /// /// /// /// /// 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 常用 加密 解密 方法