对称加密(3) NET对称加密体系
对称加密(3) NET对称加密体系
本节介绍System.Security.Cryptography名称空间中的对称加密类。
1. SymmetricAlgorithm类
SymmetricAlgorithm是抽象类,是所有对称加密算法的基类,该类定义的成员在其子类AES类中做介绍。
当使用派生类时,从安全的角度考虑,仅在使用完对象后强制垃圾回收是不够的。必须对该对象显式调用Clear方法,以便在释放对象之前将对象中所包含的所有敏感数据清零。注意,垃圾回收并不会将回收对象的内容清零,只是将内存标记为可用于重新分配。因而,垃圾回收对象中所包含的数据可能仍存在于未分配内存的内存堆中。在加密对象的情况下,这些数据可能包含敏感信息,如密钥数据或纯文本块。
.NET Framework中所有包含敏感数据的加密类均实现Clea方法。被调用时,Clear方法用0覆盖对象内的所有敏感数据,然后释放对象以便它能被垃圾回收器安全地回收。当对象已被清零并释放后,应该调用Dispose方法并将disposing参数设置为True,以释放与对象关联的所有托管资源和非托管资源。
2. AES类
AES类是一个抽象类,高级加密标准 (AES) 的所有实现都必须继承此类。该类的成员如下:
1) 构造函数Aes()。AES抽象类只定义了一个无参的构造函数。
2) Aes.Create方法。该静态方法创建用于执行对称算法的加密对象。
3) Aes.Create (String)方法。String类型的参数为要使用的AES的特定实现的名称。
4) CreateDecryptor()方法。该方法继承自SymmetricAlgorithm类,用当前的Key属性和初始化向量(IV)创建对称解密器对象。
注意 对于给定的密钥k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为同一个密码需要文本输出块。如果纯文本流中有重复块,则密码文本流中也会有重复块。如果未经授权的用户知道了纯文本块结构的任何信息,就可以利用该信息来解密已知的密码文本块,并有可能重新获得你的密钥。为了防止这个问题,前一个块中的信息被混合到下一个块的加密过程中。这样,两个相同的纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需要初始化向量来加密数据的第一个块。
5) CreateDecryptor (Byte[]key, Byte[]iv)方法。在派生类中重写时,用指定的Key属性和初始化向量(IV)创建对称解密器对象。
6) CreateEncryptor()方法。该方法继承自SymmetricAlgorithm类,用当前的Key属性和初始化向量(IV)创建对称加密器对象。
说明 如果当前的Key属性为null,则将调用GenerateKey方法以创建新的随机Key。如果当前的IV属性为null,则将调用GenerateIV方法以创建新的随机 IV。使用具有相同签名的CreateDecryptor重载来解密此方法的结果。
7) CreateEncryptor(byte[]rgbKey,byte[]rgbIV)方法。用指定的Key属性和初始化向量(IV)创建对称加密器对象。
8) GenerateIV()方法。该方法继承自SymmetricAlgorithm类,当在派生类中重写时,生成用于该算法的随机初始化向量 (IV)。
9) GenerateKey()方法。该方法继承自SymmetricAlgorithm类,当在派生类中重写时,生成用于该算法的随机密钥 (Key)。
10) ValidKeySize(int bitLength)方法。该方法继承自SymmetricAlgorithm类,确定指定的密钥大小对当前算法是否有效。如果指定的密钥大小对当前算法有效,则为 true,否则,为false。
11) BlockSize属性。继承自SymmetricAlgorithm类,获取或设置加密操作的块大小(单位:位)。块大小是在一个操作中可加密或解密的基本数据单元。长于块大小的消息将作为连续块处理;对于短于块大小的消息,必须用额外的位进行填充以达到块大小。有效块大小是由所用的对称算法确定的。
12)FeedbackSize属性。继承自SymmetricAlgorithm类,获取或设置加密操作的反馈大小(单位:位)。反馈大小确定反馈到连续加密或解密操作的数据量。反馈大小不能大于块大小。
13)IV属性。继承自SymmetricAlgorithm类,获取或设置对称算法的初始化向量 (IV)。
14)Key属性。继承自SymmetricAlgorithm类,获取或设置对称算法的密钥。密钥既用于加密,也用于解密。为了保证对称算法成功,必须只有发送方和接收方知道密钥。有效密钥大小由对称算法的具体实现指定,并且在LegalKeySizes属性中列出。如果此属性在使用时为 null,则调用GenerateKey 方法以创建新的随机值。
15) KeySize属性。继承自SymmetricAlgorithm类,获取或设置对称算法所用密钥的大小(单位:位)。有效密钥大小由对称算法的具体实现指定,并且在LegalKeySizes属性中列出。
16) KeySizes[] LegalBlockSizes属性。继承自SymmetricAlgorithm类,获取对称算法支持的块大小(单位:位)。对称算法仅支持与该数组中的条目匹配的块大小。
17) KeySizes[] LegalKeySizes属性。继承自SymmetricAlgorithm类,获取对称算法支持的密钥大小(单位:位)。对称算法仅支持与该数组中的条目匹配的密钥大小。
18) CipherMode Mode属性。继承自SymmetricAlgorithm类,默认值为CipherMode.CBC。
说明CipherMode枚举指定用于加密的块密码模式。共有5个成员:
密码块链 (CBC) 模式引入了反馈。每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。在加密块之前,初始化向量通过按位“异或”操作与第一个纯文本块结合。如果密码文本块中有一个位出错,相应的纯文本块也将出错。此外,后面的块中与原出错位的位置相同的位也将出错。
电子密码本 (ECB) 模式分别加密每个块。这意味着任何纯文本块只要相同,并且在同一消息中,或者在使用相同密钥加密的不同消息中,都将被转换成同样的密码文本块。如果要加密的纯文本包含大量重复的块,则逐块破解密码文本是可行的。另外,随时准备攻击的对手可能在你没有察觉的情况下替代和交换个别的块。如果密码文本块中有一个位出错,相应的整个纯文本块也将出错。
输出反馈 (OFB) 模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块。此模式与 CFB相似;这两种模式的唯一差别是移位寄存器的填充方式不同。如果密码文本中有一个位出错,纯文本中相应的位也将出错。但是,如果密码文本中有多余或者缺少的位,则那个位之后的纯文本都将出错。
密码反馈 (CFB) 模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块。该模式使用在长度上为一个块且被分为几部分的移位寄存器。例如,如果块大小为 8 个字节,并且每次处理一个字节,则移位寄存器被分为 8 个部分。如果密码文本中有一个位出错,则一个纯文本位出错,并且移位寄存器损坏。这将导致接下来若干次递增的纯文本出错,直到出错位从移位寄存器中移出为止。
密码文本窃用 (CTS) 模式处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与 CBC模式的行为相同。
19) PaddingMode Padding属性。获取或设置对称算法中使用的填充模式。默认值为 PaddingMode.PKCS7。
说明 PaddingMode枚举指定在消息数据块比加密操作所需的全部字节数短时应用的填充类型。该枚举共有5个成员:
None,不填充。
PKCS7,填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
Zeros,填充字符串由设置为0的字节组成。
ANSIX923,填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。
ISO10126,填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。
大多数纯文本消息不会包含可完全填充块的大量字节,通常没有足够的字节填充最后的块。当发生这种情况时,向文本添加填充字符串。例如,块长度为 64 位,而最后的块只包含 40 位,则会添加 24 位的填充字符串。
某些加密标准指定特定的填充方案。下面的示例演示这些模式的工作原理。假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF:
数据: FF FF FF FF FF FF FF FF FF
ANSIX923填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
ISO10126 填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07
3. AesCryptoServiceProvider类
AesCryptoServiceProvider类继承自AES类,是对高级加密标准(AES)算法的实现。该类的成员可参看AES 类成员。
4. AesManaged类
AesManaged类继承自AES类,是高级加密标准(AES)算法的托管实现。AesManaged类将块限制为128 位,且不允许反馈模式。该类的成员可参看AES类成员。
5. DES 类
DES类是抽象类,所有实现DES加密标准的类都必须继承自此类。DES类的成员简介如下。
1) DES()方法。DES类的构造函数。
2) Create()方法。创建加密对象的实例以执行数据加密标准(DES)算法。
3) DES Create(string algName)方法。使用指定的名称创建加密对象的实例以执行数据加密标准(DES)算法。
4) CreateDecryptor()。参见AES类同名方法。
5) CreateDecryptor(byte[] rgbKey,byte[] rgbIV)方法。参见AES类同名方法。
6) IsSemiWeakKey(byte[] rgbKey)方法。验证指定的密钥是否为半弱密钥。
说明 半弱密钥是产生的密码容易被破解的密钥对。如果文本是用半弱密钥加密的,则用该半弱密钥的另一方加密产生的密码将会返回原始文本。数据加密标准 (DES) 算法有六个已知的半弱密钥对;此方法检查那些半弱密钥。
尝试设置半弱密钥将导致CryptographicException。当调用GenerateKey创建随机密钥时,绝不会返回半弱密钥。
7) IsWeakKey(byte[] rgbKey)方法。确定指定密钥是否为弱密钥。
说明 弱密钥是所生成的密码容易被破解的密钥。如果文本是用弱密钥加密的,则使用同一弱密钥再次加密所得到的密码将会返回原始文本。数据加密标准(DES)算法有4个已知的弱密钥;此方法检查是否为这些弱密钥。
尝试设置弱密钥将导致 CryptographicException。当调用 GenerateKey 创建随机密钥时,绝不会返回弱密钥。
8)ValidKeySize(int bitLength)方法。参见AES类同名方法。
9)DES类的属性与AES类相同,继承自SymmetricAlgorithm类,读者可参见AES类的属性介绍。
6. DESCryptoServiceProvider类
DESCryptoServiceProvider类是DES类的子类,是DES加密标准的具体实现。
7. RC2类
RC2类是所有实现RC2算法的类的基类。该类继承自SymmetricAlgorithm类。相关成员说明参见AES类成员说明。
8. RC2CryptoServiceProvider类
RC2CryptoServiceProvider类继承自RC2类,是RC2算法的具体实现。
9. Rijndael类
Rijndael类,继承自SymmetricAlgorithm类。该类是所有Rijndael算法实现类的父类。该类的成员说明参见AES类。
10. TripleDES类
TripleDES类是三重数据加密标准算法的基类,TripleDES的所有实现都必须从此基类派生。该类继承自SymmetricAlgorithm类,其成员介绍参看AES类成员介绍。
说明 TripleDES使用DES算法的三次连续迭代。它可以使用2个或3个56位密钥。
此算法支持从128~192位(以64位递增)的密钥长度。
11. TripleDESCryptoServiceProvider类
TripleDESCryptoServiceProvider类继承自TripleDES类,是三重数据加密算法的实现。该类的成员说明参见AES类。
------注:本文部分内容改编自《.NET 安全揭秘》
作者:玄魂
出处:http://www.cnblogs.com/xuanhun/
原文链接:http://www.cnblogs.com/xuanhun/
更多内容,请访问我的个人站点 对编程,安全感兴趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303,nw.js,electron交流群 313717550。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
关注我: