DotNet加密方式解析--对称加密
离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性”。
都是老司机了,不扯淡,站在外面的都进来,然后请后面的把门关一下,我们接着出发。
上一篇主要介绍.NET的散列加密,散列算法主要用于签名等操作,在我们的项目中,如果对加密没有特别的要求,一般都是采用的对称加密方式,因为这种加密方式相较其他加密方式较为简单,但是这种加密方式比较的高效,所以今天就介绍一下.NET的对称加密方式。
一.DotNet对称加密概述:
对称加密是采用单密钥加密方式,这也就意味着加密和解密都是用同一个密钥。根据密码学的相关定义,对称加密系统的组成部分有5个,分别是明文空间,密文空间,密钥空间,加密空间,解密算法。接下来用一个示意图来表示一下:
DotNet对称加密算法的核心是一个密码函数,该函数将固定大小的消息数据块(纯文本)转换成加密数据库(加密文本)。转化为加密文本或重建为纯文本都需要密钥,加密是可逆的,或者说是双向的过程,可以使用密钥来反转加密效果并重建纯文本。
大多数对称加密算法是在不同的密码模式下运行,在密码函数处理数据之前,这些模式指定了准备这些数据的不同方式。密码模式有:电子代码薄模式,密码块链接,密码反馈模式。
有关块值填充的内容在下面会讲解到。
二.DotNet对称加密类解析:
1.对称加密分类:
(1).在.NET中对称加密算法分类有如下结构图:
(2).对于.NET对称加密算法的说明如下表格:
算法名称 |
算法说明 |
DES加密算法 | 采用的是分组加密方式,使用56位密钥加密64位明文,最后产生64位密文 |
3DES加密算法 | 采用168位的密钥,三重加密,速度比较的慢 |
TripleDES加密算法 | 用两个密钥对数据进行3次加密/解密运算 |
RC2加密算法 | 运用密钥长度可变,对明文采取64位分组加密 |
RC4加密算法 | 运用一个密钥长度可变的面向字节流的加密算法,以随机置换为基础 |
RC5加密算法 | 运用一种分组长度、密钥长度、加密迭代轮数都可变的分组加密算法。(包含密钥扩展、加密算法、解密算法) |
RC6加密算法 | RC6继承了RC5的循环移位思想,RC6是输入的明文由原先2个区扩展为4个块区 |
Rijndael加密算法 | 运用反复运算的加密算法,允许数据区块及密钥的长度可变。数据区块与密钥长度的变动时各自独立的 |
2.DotNet对称加密核心对象解析:
在.NET中对称算法的层次结构如下图:
Ⅰ.SymmetricAlgorithm类解析:
SymmetricAlgorithm类允许配置一个算法(选择大小,填充模式)并创建加密和解密数据的实例;不能使用该类和导出实现类来种子直接处理数据。接下来我们具体了解一下SymmetricAlgorithm类的一些方法和属性。该类是一个抽象类,是所有对称加密算法基类。在使用派生类时,如果仅在用完对象后强制垃圾回收是不够的,需要对该对象显示的调用clear方法,以便在释放对象之前将对象中所包含的所有敏感数据清除。
(1).IV属性:获取或设置对称算法的初始化向量。
- public virtual byte[] IV
- {
- get
- {
- if (this.IVValue == null)
- this.GenerateIV();
- return (byte[]) this.IVValue.Clone();
- }
- set
- {
- if (value == null)
- throw new ArgumentNullException("value");
- if (value.Length != this.BlockSizeValue / )
- throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidIVSize"));
- this.IVValue = (byte[]) value.Clone();
- }
- }
该属于使用字节数组的形式表示Key,该属性具有get和set属性,表明该属性是可读可写的,该属性为虚属性,可以在子类中重写。Key属性是用来获取或设置对称算法的密钥,密钥即可使用于加密也可以使用于解密。
(2).LegalBlockSizes属性: 获取对称算法支持的块大小(以位为单位)。
- public virtual KeySizes[] LegalBlockSizes
- {
- get
- {
- return (KeySizes[]) this.LegalBlockSizesValue.Clone();
- }
- }
该属性为虚属性,在子类中可重写,该属性是只读属性。
(3).Create()方法:创建用于执行对称算法的指定加密对象。
- public static SymmetricAlgorithm Create(string algName)
- {
- return (SymmetricAlgorithm) CryptoConfig.CreateFromName(algName);
- }
该方法CryptoConfig.CreateFromName()方法在前面一篇介绍过,在这里就不做具体的介绍,Create()接收一个SymmetricAlgorithm类型的字符串参数,指定本次System.Security.Cryptography.SymmetricAlgorithm字符串。
(4).Mode属性:获取或设置对称算法的运算模式。
- public virtual CipherMode Mode
- {
- get
- {
- return this.ModeValue;
- }
- set
- {
- if (value < CipherMode.CBC || CipherMode.CFB < value)
- throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidCipherMode"));
- this.ModeValue = value;
- }
- }
该属性是一个虚属性,获取和设置密码代码,拉取准备数据,由代码可以看出,该属性含有一个枚举类型CipherMode,我们接下来了解一下这个枚举类型:
CipherMode枚举类型:指定用于加密的块加密模式。
- [ComVisible(true)]
- public enum CipherMode
- {
- CBC = ,
- ECB = ,
- OFB = ,
- CFB = ,
- CTS =
- }
CBC(密码块链):该模式引入类反馈;ECB(电子密码本):该模式分别加密每个块;OFB(输出反馈):该模式将少量递增的纯文本处理改成密码文本,而不是以此处理整个块;CFB(密码反馈):该模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块;CTS(密码文本窃用):该模式处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。
(5).Padding属性: 获取或设置对称算法中使用的填充模式。
- public virtual PaddingMode Padding
- {
- get
- {
- return this.PaddingValue;
- }
- set
- {
- if (value < PaddingMode.None || PaddingMode.ISO10126 < value)
- throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidPaddingMode"));
- this.PaddingValue = value;
- }
- }
该属性是对称算法中使用的填充模式,默认值为 PKCS7。该属性可读可写,填充数据的部分块。由该属性可知一个枚举类型PaddingMode。
PaddingMode枚举:指定当消息数据块较短时要应用的填充类型,比加密操作所需的全部字节数。
- [ComVisible(true)]
- public enum PaddingMode
- {
- None = ,
- PKCS7 = ,
- Zeros = ,
- ANSIX923 = ,
- ISO10126 =
- }
该枚举类型有5个成员, None = 1:不填充;PKCS7 = 2:PKCS#7填充字符串由字节序列组成,每个字节都是等于添加的填充字节的总数; Zeros = 3:填充字符串由设置为零的字节组成; ANSIX923 = 4:ANSI X 923填充字符串由长度前面填充零的字节序列组成;ISO10126 = 5:ISO10126填充字符串由长度之前的随机数据组成。
Ⅱ.ICryptoTransform:
ICryptoTransform定义基本的加密转换运算,该接口的实例可以将文纯文本转化成加密文本,或者将加密文本转化为纯文本,每一个ICryptoTransform都是单向的,只能被用于其创建的目的。该接口的属性和方法如下:
- /// <summary>
- /// 获取输入块大小。
- /// </summary>
- int InputBlockSize { get; }
- /// <summary>
- /// 获取输出块大小。
- /// </summary>
- int OutputBlockSize { get; }
- /// <summary>
- /// 获取一个值,该值指示是否可以转换多个块。
- /// </summary>
- bool CanTransformMultipleBlocks { get; }
- /// <summary>
- /// 获取一个值,该值指示是否可重复使用当前转换。
- /// </summary>
- bool CanReuseTransform { get; }
- /// <summary>
- /// 转换输入字节数组的指定区域,并将所得到的转换复制到输出字节数组的指定区域。
- /// </summary>
- int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset);
- /// <summary>
- /// 转换指定字节数组的指定区域。
- /// </summary>
- byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);
ICryptoTransform接口实例并不能使用于自己,.NET提供了CryptoStream类,定义将数据流链接到加密转换的流。创建CryptoStream的实例需要一个真实流、ICryptoTransform、CryptoStreamMode枚举的值。
三.DotNet对称加密实例:
1.DES算法加密实例:
- /// <summary>
- /// 加密数据
- /// </summary>
- /// <param name="text"></param>
- /// <param name="sKey"></param>
- /// <returns></returns>
- public static string Encrypt(string text, string sKey)
- {
- if (string.IsNullOrEmpty(text))
- {
- throw new ArgumentNullException(text);
- }
- if (string.IsNullOrEmpty(sKey))
- {
- throw new ArgumentNullException(sKey);
- }
- MemoryStream ms = null;
- DESCryptoServiceProvider des = null;
- try
- {
- des = new DESCryptoServiceProvider();
- var inputByteArray = Encoding.Default.GetBytes(text);
- var bKey = Encoding.ASCII.GetBytes(Md5Hash(sKey).Substring(, ));
- des.Key = bKey;
- des.IV = bKey;
- ms = new MemoryStream();
- var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, , inputByteArray.Length);
- cs.FlushFinalBlock();
- var ret = new StringBuilder();
- foreach (byte b in ms.ToArray())
- {
- ret.AppendFormat("{0:X2}", b);
- }
- return ret.ToString();
- }
- catch (NotSupportedException nsex)
- {
- throw nsex;
- }
- catch (ArgumentNullException arnex)
- {
- throw arnex;
- }
- catch (EncoderFallbackException efex)
- {
- throw efex;
- }
- catch (ArgumentException arex)
- {
- throw arex;
- }
- catch (CryptographicException crex)
- {
- throw crex;
- }
- finally
- {
- if (ms != null)
- {
- ms.Close();
- }
- if (des != null)
- {
- des.Clear();
- }
- }
- }
2.DES算法解密实例:
- /// <summary>
- /// 解密数据
- /// </summary>
- /// <param name="text"></param>
- /// <param name="sKey"></param>
- /// <returns></returns>
- public static string Decrypt(string text, string sKey)
- {
- if (string.IsNullOrEmpty(text))
- {
- throw new ArgumentNullException(text);
- }
- if (string.IsNullOrEmpty(sKey))
- {
- throw new ArgumentNullException(sKey);
- }
- MemoryStream ms = null;
- DESCryptoServiceProvider des = null;
- try
- {
- des = new DESCryptoServiceProvider();
- var len = text.Length / ;
- byte[] inputByteArray = new byte[len];
- int x;
- for (x = ; x < len; x++)
- {
- var i = Convert.ToInt32(text.Substring(x * , ), );
- inputByteArray[x] = (byte)i;
- }
- var bKey = Encoding.ASCII.GetBytes(Md5Hash(sKey).Substring(, ));
- des.Key = bKey;
- des.IV = bKey;
- ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, , inputByteArray.Length);
- cs.FlushFinalBlock();
- return Encoding.Default.GetString(ms.ToArray());
- }
- catch (NotSupportedException nsex)
- {
- throw nsex;
- }
- catch (ArgumentNullException arnex)
- {
- throw arnex;
- }
- catch (EncoderFallbackException efex)
- {
- throw efex;
- }
- catch (ArgumentException arex)
- {
- throw arex;
- }
- catch (CryptographicException crex)
- {
- throw crex;
- }
- finally
- {
- if (ms != null)
- {
- ms.Close();
- }
- if (des != null)
- {
- des.Clear();
- }
- }
- }
四.总结:
这篇博文主要讲解.NET的对称加密方式,从原理上讲解和源码分析,以及提供了对应的实例,辅助我们去理解加密。如有错误和不足之处,欢迎评批指正。
加密算法系列:
DotNet加密方式解析--散列加密:http://www.cnblogs.com/pengze0902/p/6268700.html
DotNet加密方式解析--对称加密:http://www.cnblogs.com/pengze0902/p/6268702.html
DotNet加密方式解析--数字签名:http://www.cnblogs.com/pengze0902/p/6268709.html
DotNet加密方式解析--非对称加密:http://www.cnblogs.com/pengze0902/p/6268705.html
DotNet加密方式解析--对称加密的更多相关文章
- DotNet加密方式解析--非对称加密
新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上班两天了,公司大部分人还在休假,而我早已上班, ...
- 【转】DotNet加密方式解析--非对称加密
[转]DotNet加密方式解析--非对称加密 新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上 ...
- DotNet加密方式解析--散列加密
没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...
- DotNet加密方式解析--数字签名
马上就要过年回村里了,村里没有wifi,没有4G,没有流量,更加重要的是过几天电脑就得卖掉换车票了,得赶紧写几篇博客. 数据安全的相关技术在现在愈来愈变得重要,因为人们对于自身的信息都有一种保护的欲望 ...
- 【DotNet加密方式解析】-- 好文收藏
By -- 彭泽 一. DotNet加密方式解析--散列加密 笔记: 散列加密种类: 1.MD5 128位 2.SHA-1 160位 3.SHA-256 256位 4.SHA-384 384位 ...
- .NET加密方式解析--散列加密
在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了. 这一次将会 ...
- ssl原理,非对称加密握手,对称加密传输
SSL的基本思想是用非对称加密来建立链接(握手阶段),用对称加密来传输数据(传输阶段).这样既保证了密钥分发的安全,也保证了通信的效率. SSL握手,单方服务器认证(一般的浏览器上网) SSL握手,双 ...
- Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法
对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...
- Java Mail 发送邮件(SSL加密方式,TSL加密方式)
一.一般配置 发送邮件需要用到 mail包 maven 依赖如下: <!-- https://mvnrepository.com/artifact/javax.mail/mail --> ...
随机推荐
- OCP-1Z0-051-题目解析-第11题
11. View the Exhibit and examine the structure of the PRODUCTS table.All products have a list price. ...
- 关于Java String对象创建的几点疑问
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...
- Linux文件系统文件大小限制
去阿里面试,被问到了Linux文件系统中文件大小的限制,当时就无语了.学操作系统时这些都是现算的,回来赶紧查一下. 以下为红帽ext3文件系统所支持的max file size和max filesys ...
- Android Intent 三解决
Intent的接收处理: 1.Receiver报名 这之前已经被引入 然后看看剩下的两个接收功能上面. scheduleReceiver scheduleRegisteredReceiver: sch ...
- 生活小助手--Android项目
每次想做一个Android项目都不知道要怎么开始,所谓前期工作,都是辅助于项目能顺利完成而做的. 每一个项目开始都要有几首准备: 第一,项目要做什么? 第二,项目中有那些版块? 项目的概要设计 项目流 ...
- Android开源框架Volley(Google IO 2013)源代码及内部实现分析
1.Volley概述 在项目开发过 程中,博主曾写过大量的访问网络重复代码,特别是ListView adapter很难避免getView()方法不被重复调用,如果ImageView不利用缓存机制,那么 ...
- 【值得收藏】数据分析和可视化软件IDL的学习资料汇编【可免费下载】
IDL学习教程 IDL 是一种数据分析和图像化应用程序及编程语言,最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据.此后,IDL得到广泛运用,使用者日众.IDL能使用户可以迅速且方便地运用此 ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- Binder机制,从Java到C (5. IBinder对象传递形式)
1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...
- .net实现依赖注入
.net实现依赖注入 1. 问题的提出 开发中,尤其是大型项目的开发中,为了降低模块间.类间的耦合关系,比较提倡基于接口开发,但在实现中也必须面临最终是“谁”提供实体类的问题.Martin Fowle ...