最近在看我所在项目系统里支付方面的代码,里面包括很多加密解密方面的知识,结合平时对加密解密的了解,对.net里加解密做一个总结。

最开始遇到加密解密,可能和大家一样,MD5加密,读大学的时候 ,我喜欢了解一些安全方面知识,当时很多小型网站都存在SQL注入,找个小工具,很轻松跑出用户帐号和密码,一看密码是16位或32位,一般都是MD5加密后没有再修改过,通过http://www.cmd5.com/ 或http://www.xmd5.org/ 等网站,直接就“解密”成原始明文了(但现在这些网站已开始收费了)。最后过了一段时间才知道,原来这个是Hash散列加密,不可逆的,这些网站都通过人工学把不同帐号跑出来存储到数据库,查询的时候从数据库查询了。

.Net框架集成了常用加解密的类库,在System.Security.Cryptography命名空间下,包括可逆向加密和不可逆加密。可逆向加密又包括对称加密和非对称加密。

对称加密常用的有DES(Data Encryption Standard),TripleDES(基于DES,对一块数据用三个不通密钥进行3次加密)。DES的密钥Key为8字节,初始向量IV也为8字节;TripleDES的密钥Key为24字节,初始向量IV为8字节。都以8字节为一个块进行加密。还有AES(Advanced Encryption Standard),根据我的理解,AES只是一个标准,现在一般用该标准的算法为Rijndael。

非对称加密常用的有RSA,它通过公钥加密,私钥解密,并且他还可以用私钥签名,公钥验证的功能,一般应用于网络交互,比如IPS支付时,我们需要向IPS申请一个公钥,我们通过公钥加密一些关键字符,就只有IPS的私钥才能解密了。但在使用过程中,常常添加了比如散列比较等,而且非对称算法比对称算法慢很多,非对称公钥加密也常用来加密较少字段或者加密临时对称加密Key使用。

不可逆加密主要是散列算法加密,常见的有MD5,SHA1算法。MD5可以生产16字节的不可逆数字,SHA1可以生成20字节的不可逆数字。MD5有时表现出来是32位的数字或字符,这是每个字节的16进制展现。经常能看到的16位的MD5值,是取的MD5从第8位到第23位(包括23)之间的数字。一般在下载一些软件的时候,也会提示该软件MD5值是多少,帮助下载下来后验证,可以写个小工具通过从读取软件到内存流,再计算MD5,来校验软件。

下面直接写出TripleDES加密解密方法,步骤可以见注释:

public static byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };//加密IV向量

public static string EncryptString(string plainText, string key)

{

//如果Key不到24位,则用0补

key = key.PadLeft(24, '0');

byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0, 24));

// 把字符串明文转换成utf-8编码的字节流

byte[] plainTextArray = Encoding.UTF8.GetBytes(plainText);

try

{

// 用MemoryStream存放加密后的数据流

using (MemoryStream mStream = new MemoryStream())

{

// 使用MemoryStream 和Key、IV新建一个CryptoStream 对象

using (CryptoStream cStream = new CryptoStream(mStream,

new TripleDESCryptoServiceProvider().CreateEncryptor(bKey, IV),

CryptoStreamMode.Write))

{

// 将加密后的字节流写入MemoryStream

cStream.Write(plainTextArray, 0, plainTextArray.Length);

//把缓冲区更新到MemoryStream

cStream.FlushFinalBlock();

// 把解密后的数据流转成字节流,并转换成Base64编码

return Convert.ToBase64String(mStream.ToArray());

}

}

}

catch (Exception ex)

{

throw ex;

}

}

public static string DecryptString(string encryptedData, string key)

{

//如果Key不到24位,则用0补

key = key.PadLeft(24, '0');

byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0, 24));

// 把字符串明文转换成utf-8编码的字节流

byte[] encryptedDataArray = Convert.FromBase64String(encryptedData);

try

{

// MemoryStream存放加密后的数据流

using (MemoryStream msDecrypt = new MemoryStream(encryptedDataArray))

{

// 使用MemoryStream 和key、IV新建一个CryptoStream 对象

using (CryptoStream csDecrypt = new CryptoStream(msDecrypt,

new TripleDESCryptoServiceProvider().CreateDecryptor(bKey, IV),

CryptoStreamMode.Read))

{

byte[] decryptDataArray = new byte[encryptedDataArray.Length];

// 把解密后的数据读入到DecryptDataArray

csDecrypt.Read(decryptDataArray, 0, decryptDataArray.Length);

return Encoding.UTF8.GetString(decryptDataArray);

}

}

}

catch (Exception ex)

{

throw ex;

}

}

这里加密用csDecrypt写到内存流中,解密用csDecrypt流读取解码后的字符读到临时byte[]变量里,其实都可以一样,这里不同方法都可以读写出来,最后加密的结果直接转换成Base64编码,方便网络传输。默认new TripleDESCryptoServiceProvider().IV或Key就可以读取一个默认的Key和IV。除此之外,还有加密模式和填充模式的选择,这里用的默认模式,可以设置Mode,Padding来分别设置加密模式和填充模式,这块我也只是了解,当要求如果严格的时候,需要再仔细看下。

RSA加密解密方法如下:

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;

}

public static string EncryptString(string sSource, string sPublicKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

string plaintext = sSource;

try

{

//导入公钥加密

rsa.FromXmlString(sPublicKey);

byte[] cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintext), false);

return Convert.ToBase64String(cipherbytes);

}

catch (Exception ex)

{

throw ex;

}

}

public static string DecryptString(string sSource, string sPrivateKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

try

{

//导入私钥解密

rsa.FromXmlString(sPrivateKey);

byte[] byteEn = Convert.FromBase64String(sSource);

byte[] plaintbytes = rsa.Decrypt(byteEn, false);

return Encoding.UTF8.GetString(plaintbytes);

}

catch (Exception ex)

{

throw ex;

}

}

由于非对称加密公钥和私钥表现成一个xml的字符串,这里用GenerateKeys方法返回一个默认的公钥私钥对。私钥类试:

<RSAKeyValue><Modulus>qZ0BKzsUNJR5x9TUYfAaDzuLuJ6uxT3eE9Zqd2MKQ+FmS1az43uH8bGHerWoStl2tSXUDENQ0AieaxFpn/BTJZ33rmT3PPxv6022vwB+17XYfCDigb7db30jKIefDydQMEC8P/4EAEp6/IiE4H35P+2dwoN3/p4U+C2aTFIpQ78=</Modulus><Exponent>AQAB</Exponent><P>7GkvmXofKoNwEUEtVtYT0Na04Ua4cZA25GfK5ZB8XsxMyTEr9pNMjNZLJlRAG1TeOSM2qOisofGfytQHidU/rw==</P><Q>t6rjt7IXXRF8/ye+bnzhvFvRv0fo0wObdYTuD8d4ruxLI8p847cfI+IGIyXGz7lXkLOuAVk5hVfpFqgx3WCw8Q==</Q><DP>VI0eIAcERIEzwIgN/iOcfLF9iaBwcPVCHJhegZIWWRU6VS6H6a0u0KQHxpKVRvEodUj50Jk+vMCdBL6mX45sMw==</DP><DQ>q/VsdL1h0HoiLIZabfmwI3lYHJ3H52C2OUY22UEpxaRoCV94pH77wc3JbzjcNfnSeSExJgQSrbyL9/GLljgEEQ==</DQ><InverseQ>ppiIZBMKM74wSwSyBVoYNjScnW2Hjf3kP+q15GONazTp9Gx8uSQViy8UI+GCqMT/8p5ySzVISwF2jWFw8uhhog==</InverseQ><D>KQ6QUd6jLXcjY3PpVSvBox5O3AnNVIF9WF/2tZ+LxJKzKFl8gfxNE/xdRx7h9fxd98uIYM+KqFDtyA0W/Fg4R+Uda1SHOLDgsdo1FISmQsCEK8E8jIINf7QeYTOPconvYDglznAfZBE0Ri+keLZPnsy6Pslths56wB40yW+GJwE=</D></RSAKeyValue>。

公钥就只有Modulus和Exponent节点。

散列算法MD5加密如:

public static string GetMd5(string contents)

{

if (string.IsNullOrEmpty(contents))

{

return string.Empty;

}

StringBuilder result = new StringBuilder();

System.Security.Cryptography.MD5CryptoServiceProvider md = new System.Security.Cryptography.MD5CryptoServiceProvider();

byte[] hash = md.ComputeHash(System.Text.Encoding.UTF8.GetBytes(contents));

md.Clear();

for (int i = 0, len = hash.Length; i < len; i++)

{

//每个字符转换为16进制

result.Append(hash[i].ToString("X").PadLeft(2, '0'));

}

return result.ToString();

}

但在B/S网站中生产MD5值时,一般可以直接:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");返回32位长的MD5值。

以上介绍了可逆不可逆加密方式,和常用的加密解密算法,当然还有很多算法没有介绍,并且这些算法的深入使用也是有很多可以介绍的地方,但本篇作为抛砖引玉,以后更加深入使用时再仔细学习了解。

最后上传测试代码,VS2008,.NET3.5下编译运行通过!

/Files/Lawson/EncryptionTests.rar

转载于:https://www.cnblogs.com/Lawson/archive/2011/08/21/2147958.html

.Net中加密解密相关知识相关推荐

  1. php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

    本文实例讲述了php中加密解密DES类的简单使用方法.分享给大家供大家参考,具体如下: 在平时的开发工作中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,所以要正确使用DES加密解密 代 ...

  2. java写微信小程序答辩问题_java微信小程序开发中加密解密算法总结

    详解java微信小程序开发中加密解密算法 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让 ...

  3. php字符串加密解密源码,PHP中加密解密字符串函数源代码

    PHP中加密解密字符串函数源代码: /** *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ / ...

  4. 聚合物?锂离子?保护板?电子DIY中的锂电池相关知识大讲解

    锂电池相关知识 因为看到别人做平衡车直接使用18650电池供电,整整齐齐地码了3颗在PCB上感觉十分优雅,所以自己也想要用18650做一个,奈何对这方面一无所知,索性把相关知识都学一遍吧. 因为网上资 ...

  5. js中加密解密时中文符号乱码

    原先加密解密定义方法请看:JavaScript自定义实现字符串加密和解密 上面的方法会导致后台给前端返回名称类的字符串中带中文符号时,页面渲染的会有乱码的情况存在,如何解决这一问题呢,发现利用以下几种 ...

  6. Mina SSL Filter安全加密过滤器相关知识介绍

    原文地址:Mina SSLFilter(Apahce Mina user guide Chapter11 SSL Filter) SslFilter过滤器是负责管理数据的加密和解密通过安全连接.每当你 ...

  7. 数学中的向量相关知识

    前端做3D效果,会用到向量相关知识: 向量叉积=向量的模乘以向量夹角的正弦值:a×b=|a||b|sin<a,b> 向量点积=向量的模乘以向量夹角的余弦值.a·b=|a||b|cos< ...

  8. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  9. Java字符串的重要性_java中的字符串相关知识整理

    字符串就是一系列的字符组合的串,如果写过C/C++的应该就了解,在字符串的操作上会有许多操作的函数与类,用于简化代码的开发.一方面是因为字符串在代码中会频繁用到,另一方面是因为字符串的操作非常麻烦. ...

最新文章

  1. paperclip的id partition功能还是相当的给力,省得我们实现了,这个功能之前连想都没想到,...
  2. java 登录下线_java 实现 一个账号只能在一个地方登陆,其他地方被下线
  3. 什么是webservice?
  4. Oracle ETL日志审计存储过程示例
  5. list.action.php,教你利用 PHP 实现高性能微服务部署
  6. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
  7. 聊聊 HTTP 常见的请求方式
  8. 这些贷款合同陷阱你知道多少?
  9. 天猫双11凭什么达到1682亿?这些支撑技术或许可以告诉你
  10. 使用Spring Integration进行消息处理
  11. [html] 写一个搜索框,聚焦时搜索框向左拉长并有动画效果
  12. 不是有效的函数或过程名_过程和函数
  13. 苹果Mac如何显示隐藏文件?
  14. 路由交换技术——IS-IS
  15. db powerdesign 入门
  16. 模拟CMOS集成电路设计学习笔记(一)
  17. Marlin固件运动控制代码分析
  18. 关于项目管理的一些个人见解
  19. 计算机的串口波特率,串口常用参数
  20. Redis数据结构Set应用场景--黑名单校验器、京东与支付宝抽奖、微博榜单与QQ群的随机展示、帖子点赞、关注与粉丝、微关系计算、HyperLogLog的入门使用

热门文章

  1. 机器人把大龙拉出来_LOL-LPL夏季赛:Wei男枪打野未换惩戒 ES让BLG拿下首胜
  2. $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']三者的区别
  3. 《PaaS程序设计》一1.2 云能为创新做什么
  4. mysql 聚集函数 count 使用详解
  5. tomcat项目支持跨域访问
  6. 已有记录表添加特定排序主键ID
  7. 占用51cto。记录自己
  8. C#中this关键字-调用本类成员
  9. 如何快速获知需要的SPS Sql Search语法
  10. EMNLP自然语言处理经验方法