对称算法(Symmetric Algorithm),有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算,同时解密密钥也可以从加密密钥中推算。而在大多数的对称算法中,加密密钥和解密密钥是相同的。所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。
对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。
对称算法的加密强度也依赖于密钥。如果开发人员配置一个长的密钥,将是非常难破解的。如图4-6所示,加密和解密过程都需要使用同一密匙,利用加密解密的内存容器plaintext和ciphertext。
[TR]
[TD][I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=124 alt="" src="http://pic.aIhUaU.com/201602/15/121713309.jpg" width=404 border=0>[/TD][/TR]
[TR]
[TD]图4-6 对称加密算法机理[/TD][/TR]
对称加密算法基于简单的数学操作,工作效率高。因此当要加密的数据量非常大时它是最好的选择。基于对称的加密可以被黑客暴力破解,但是长的密钥可以在黑客破解密码的时候保护数据更长的时间。
另外,在使用密钥或密码对称加密过程中初始化向量(Initial Vector,IV)也很重要。IV被使用在最初的编码中(加密或者解密)。在所有的对称算法类中都有Mode的属性,这是IV使用的。如果设置Mode属性为CipherMode.CBC(Cipher Block Chaining),则使用这个模式时,每个数据块使用来自前一个块的值来处理,也就是说,如果系统处理第三块数据,它就会从第二块中取一些信息。同样,它会取第一块数据中的信息用来处理第二块数据。但是在第一块数据之前没有可以用的块,因此它将使用IV来处理第一块。
这个技术确保没有两个相同的块产生相同的输出并且因此使得数据更安全。然而如果使Mode=CipherModer.ECB(Electronic codebook mode),则应用程序就不会使用上面的方法(使用前面的处理的块信息处理后面的块)。如果想用很少的资源和时间处理大量的消息,那么这个方法是不错的选择。
对称加密算法主要包括的算法如表4-4所示。
表4-4 对称加密算法
[TR]
[TD]
算法名称
[/TD]
[TD]
算 法 类
[/TD]
[TD]
有效密
钥大小[B]/b
[/TD]
[TD]
默认密
钥大小[B]/b
[/TD]
[TD]
默认实现类
[/TD][/TR]
[TR]
[TD]
DES
[/TD]
[TD]
DES
[/TD]
[TD]
64
[/TD]
[TD]
64
[/TD]
[TD]
DESCryptoServiceProvider
[/TD][/TR]
[TR]
[TD]
TripleDES
[/TD]
[TD]
TripleDES
[/TD]
[TD]
128,192
[/TD]
[TD]
192
[/TD]
[TD]
TripleDESCryptoServiceProvider
[/TD][/TR]
[TR]
[TD]
RC2
[/TD]
[TD]
RC2
[/TD]
[TD]
40~128
[/TD]
[TD]
128
[/TD]
[TD]
RC2CryptoServiceProvider
[/TD][/TR]
这里需要注意的是,所有的算法类都是继承于抽象类SymmetricAlgorithm,并且每个类都支持不同大小的密钥。相同的情况下,它们也支持不同大小的初始化向量。
抽象类不能直接创建任何实例。用SymmetricAlgorithm类中的共享Create方法可以创建加密实例,代码如下:
TestCmCrypto=SymmetricAlgorithm.Create("TestC");
该方法为创建者返回一个TestC默认实现的实例,而不用去关心具体如何实现TestC类,代码将自动适应改变并正确的工作,或可能在将来类用托管代码写,原代码依然可以接受。
对称加密算法SymmetricAlgorithm类的方法和属性如表4-5所示。
表4-5 SymmetricAlgorithm类的方法和属性描述
[TR]
[TD]
属性和方法
[/TD]
[TD]
描 述
[/TD][/TR]
[TR]
[TD]
BlockSize
[/TD]
[TD]
分开处理的数据块的大小,大的数据将被
分成小的数据块处理,如果数据小于块大小,
则被追加(使用一些默认值填充)
[/TD][/TR]
[TR]
[TD]
Key
[/TD]
[TD]
在处理数据的时候将要使用密钥,这个密
钥被配置成使用字节数组
[/TD][/TR]
[TR]
[TD]
IV
[/TD]
[TD]
数据处理的时候使用初始化向量,配置成字节数组
[/TD][/TR]
[TR]
[TD]
KeySize
[/TD]
[TD]
密钥的所有位的大小
[/TD][/TR]
[TR]
[TD]
LegalBlockSize
[/TD]
[TD]
返回BlockSize的枚举告诉你判断包括最
大值,最小值和跳跃值在内的块大小,
跳跃值是指下一个判断值,如最小值是
32,跳跃值是16,下一个判断值就是48,64等
[/TD][/TR]
[TR]
[TD]
Mode
[/TD]
[TD]
位操作得到或者设置模式,值是
CipherMode枚举中的一个
[/TD][/TR]
[TR]
[TD]
Padding
[/TD]
[TD]
得到或者设置PaddingMode枚举中的一
个追加值(填充块中空余的区域)
[/TD][/TR]
[TR]
[TD]
LegalKeySize
[/TD]
[TD]
和LegalBlockSize一样,但处理的是KeySize
[/TD][/TR]
[TR]
[TD]
Create
[/TD]
[TD]
创建默认算法实现的类的实例
[/TD][/TR]
[TR]
[TD]
CreateEncryptor
[/TD]
[TD]
返回一个可以手动加密数据的IcryptoTransform对象
[/TD][/TR]
[TR]
[TD]
CreateDecryptor
[/TD]
[TD]
返回一个可以手动解密数据的IcryptoTransform对象
[/TD][/TR]
[TR]
[TD]
GeneratrKey and GenerateIV
[/TD]
[TD]
在加密或解密的过程中如果Key和IV是
null则可以产生默认的密钥和IV
[/TD][/TR]
[TR]
[TD]
VaildKeySize
[/TD]
[TD]
检查给定的密钥是不是算法的有效密钥
[/TD][/TR]
[TR]
[TD]
Clear
[/TD]
[TD]
清除和消除所有的资源以及象密钥和IV这样的内存信息
[/TD][/TR]