创建Tool类,该类有md5加密解密和解密2个静态方法,要求采用单钥匙md5加密解密,2个方

对称加密(3) NET对称加密体系
本节介绍System.Security.Cryptography名称空间中的对称加密类。
1.SymmetricAlgorithm类
SymmetricAlgorithm是抽象类,是所有对称加密算法的基类,该类定义的成员在其子类AES类中做介绍。
当使用派生类时,从安全的角度考虑,仅在使用完对象后强制垃圾回收是不够的。必须对该对象显式调用Clear方法,以便在释放对象之前将对象中所包含的所有敏感数据清零。注意,垃圾回收并不会将回收对象的内容清零,只是将内存标记为可用于重新分配。因而,垃圾回收对象中所包含的数据可能仍存在于未分配内存的内存堆中。在加密对象的情况下,这些数据可能包含敏感信息,如密钥数据或纯文本块。
.NET Framework中所有包含敏感数据的加密类均实现Clea方法。被调用时,Clear方法用0覆盖对象内的所有敏感数据,然后释放对象以便它能被垃圾回收器安全地回收。当对象已被清零并释放后,应该调用Dispose方法并将disposing参数设置为True,以释放与对象关联的所有托管资源和非托管资源。
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属性为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类成员。
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加密标准的具体实现。
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 安全揭秘》
阅读(...) 评论()加密、解密MD5,SHA等_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
加密、解密MD5,SHA等
上传于||文档简介
&&加​密​、​解​密​M​D,​S​H​A​等
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
你可能喜欢常用数据加密和解密方法汇总_数据加密-牛bb文章网
常用数据加密和解密方法汇总 数据加密
所属栏目:
应同事所邀把ASP.NET(C#)常用数据加密和解密方法列出供大家参考,特此发布出来,希望对大家有点帮助。数据虽来源于网络,系仰天一笑悉心整理。ASP.NET(C#)常用数据加密和解密方法汇总一、数据加密的概念1、 基本概念2、 基本功能3、 加密形式二、数据加密的项目应用和学习1、 媒体加密:DRM2、 文件加密:文本加密、pdf、word3、 数据加密:ASP.NET(C#)中的数据加密4、 硬件加密:加密狗三、数据加密的发展趋势四、网络数据加密算法分类1、 根本不考虑解密问题:MD5、2、 私用密钥加密:DES、AES3、 公用密钥加密:RSA4、 数字证书:五、对称加密之DES加密和解密的讲解六、非对称加密之RSA加密和解密的讲解七、ASP.NET(C#) 常用加密类实例调用讲解及免费下载(源代码免费下载点击此处&&)ASP.NET(C#)常用数据加密和解密方法汇总数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是1种主动安全防御策略,用很小的代价就可以为信息提供相当大的安全保护。一、加密的基本概念"加密",是1种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。加密的基本功能包括:1. 防止不速之客查看机密的数据文件;2. 防止机密数据被泄露或篡改;3. 防止特权用户(如系统管理员)查看私人数据文件;4. 使入侵者不能轻易地查找1个系统的文件。数据加密是确保计算机网络安全的1种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。数据加密可在网络OSI七层协议(OSI是OpenSystemInterconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有3种方式:①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密2种,同步通信加密又包含字节同步通信加密和位同步通信加密。②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。二、数据加密的应用1、 媒体加密:DRM2、 文件加密:文本加密、pdf、word3、 数据加密:ASP.NET(C#)中的数据加密4、 硬件加密:加密狗三.加密技术发展趋势①私用密钥加密技术与公开密钥加密技术相结合:鉴于2种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是1种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制1种加密协处理器。它可以集成到微机的主极上。四、加密技术的分类加密类型可以简单地分为4种:1.根本不考虑解密问题;2.私用密钥加密技术:对称式加密(Symmetric KeyEncryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同1种安全方式共享密钥很难。如:RC4、RC2、DES和 AES 系列加密算法。3.公开密钥加密技术:非对称密钥加密(Asymmetric KeyEncryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用1种密钥,解密时使用另1种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如:RSA4.数字证书。(Certificate):数字证书是1种非对称密钥加密,但是,1个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。五、对称加密之DES加密与解密一、对称加密对称加密,是1种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。单钥密码系统的安全性依赖于以下2个因素:第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。DES(Data Encryption Standard)和TripleDES是对称加密的2种实现。DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。DES使用的密钥key为8字节,初始向量IV也是8字节。TripleDES使用24字节的key,初始向量IV也是8字节。2种算法都是以8字节为1个块进行加密,1个数据块1个数据块的加密,1个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。二、加密解密过程Figure 1. DES加密解密过程上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。1、生成key和IVSystem.Security.Cryptography.TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。TripleDESCryptoServiceProvider类只有1个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:KeySize(加密密钥长度,以位为单位)= 192(24字节)BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。生成key和IV的代码很简单:TripleDESCryptoServiceProvidertDESalg=newTripleDESCryptoServiceProvider();byte[] keyArray = tDESalg.Kbyte[] IVArray = tDESalg.IV;生成的key和IV在加密过程和解密过程都要使用。2、字符串明文转成某一代码页对应的编码字节流待加密的数据可能有2种形式,1种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这1步,直接进入加密步骤。还有1种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。//待加密的字符串stringplainTextString ="Here issome data to encrypt.这里是一些要加密的数据。";//使用utf-8编码(也可以使用其它的编码)EncodingsEncoding=Encoding.GetEncoding("utf-8");//把字符串明文转换成utf-8编码的字节流byte[] plainTextArray = sEncoding.GetBytes(plainTextString);3、加密操作加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。//把字符串明文转换成utf-8编码的字节流byte[] plainTextArray = sEncoding.GetBytes(plainTextString);publicstaticbyte[]EncryptString(byte[] plainTextArray,byte[]Key,byte[] IV){//建立1个MemoryStream,这里面存放加密后的数据流MemoryStreammStream=newMemoryStream();//使用MemoryStream和key、IV新建1个CryptoStream对象CryptoStreamcStream=newCryptoStream(mStream,newTripleDESCryptoServiceProvider().CreateEncryptor(Key,IV),CryptoStreamMode.Write);//将加密后的字节流写入到MemoryStreamcStream.Write(plainTextArray,0, plainTextArray.Length);//把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区cStream.FlushFinalBlock();//把解密后的数据流转成字节流byte[]ret = mStream.ToArray();//关闭2个streams.cStream.Close();mStream.Close();}4、解密操作解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。//调用解密方法,返回已解密数据的byte[]byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray,IVArray);publicstaticbyte[]DecryptTextFromMemory(byte[]EncryptedDataArray,byte[]Key,byte[] IV){//建立1个MemoryStream,这里面存放加密后的数据流MemoryStreammsDecrypt=newMemoryStream(EncryptedDataArray);//使用MemoryStream和key、IV新建1个CryptoStream对象CryptoStreamcsDecrypt=newCryptoStream(msDecrypt,newTripleDESCryptoServiceProvider().CreateDecryptor(Key,IV),CryptoStreamMode.Read);//根据密文byte[]的长度(可能比加密前的明文长),新建1个存放解密后明文的byte[]byte[]DecryptDataArray=newbyte[EncryptedDataArray.Length];//把解密后的数据读入到DecryptDataArraycsDecrypt.Read(DecryptDataArray,0, DecryptDataArray.Length);msDecrypt.Close();csDecrypt.Close();returnDecryptDataA}有一点需要注意,DES加密是以数据块为单位加密的,八个字节1个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足八个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:“Here is some data to encrypt.这里是一些要加密的数据。”转成明文byte[]后是6六个字节,DES算法就会补上六个0值的byte,补到7两个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:"Here is some data toencrypt.这里是一些要加密的数据。\0\0\0\0\0\0"5、从编码字节流转成字符串明文//使用前面定义的Encoding,utf-8的编码把byte[]转成字符串plainTextString = sEncoding.GetString(finalPlainTextArray);六、非对称加密之RSA加密和解密的讲解RSA公钥加密算法是1977年由Ron Rivest、AdiShamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于1个十分简单的数论事实:将2个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第1个能同时用于加密和数字签名的算法,也易于理解和操作。  RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。  RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度都还在增加,不利于数据格式的标准化。目前,SET(Secure ElectronicTransaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。保密级别对称密钥长度(bit)RSA密钥长度(bit)ECC密钥长度(bit)保密年限808010241602010112112204822420301281283072256204019219276803842080256256153605122120 这种算法1978年就出现了,它是第1个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:RonRivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家CliffordCocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。  RSA算法是1种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中1个加密,则需要用另1个才能解密。  RSA的算法涉及3个参数,n、e1、e2。  其中,n是2个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。  e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。  (n及e1),(n及e2)就是密钥对。  RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;  e1和e2可以互换使用,即:  A=B^e2 mod n;B=A^e1C#代码实现需引用using System.Security.C/// &summary&/// RSA加密/// &/summary&/// &paramname="publickey"&&/param&/// &paramname="content"&&/param&///&returns&&/returns&public static string RSAEncrypt(string publickey, stringcontent){publickey =@"&RSAKeyValue&&Modulus&5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=&/Modulus&&Exponent&AQAB&/Exponent&&/RSAKeyValue&";RSACryptoServiceProvider rsa = newRSACryptoServiceProvider();byte[]rsa.FromXmlString(publickey);cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content),false);return Convert.ToBase64String(cipherbytes);}/// &summary&/// RSA解密/// &/summary&/// &paramname="privatekey"&&/param&/// &paramname="content"&&/param&///&returns&&/returns&public static string RSADecrypt(string privatekey, stringcontent){privatekey =@"&RSAKeyValue&&Modulus&5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=&/Modulus&&Exponent&AQAB&/Exponent&&P&/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==&/P&&Q&6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==&/Q&&DP&ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==&/DP&&DQ&MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==&/DQ&&InverseQ&EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==&/InverseQ&&D&vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=&/D&&/RSAKeyValue&";RSACryptoServiceProvider rsa = newRSACryptoServiceProvider();byte[]rsa.FromXmlString(privatekey);cipherbytes = rsa.Decrypt(Convert.FromBase64String(content),false);return Encoding.UTF8.GetString(cipherbytes);}七、ASP.NET(C#)常用加密类调用的讲解1、C#常用加密解密类库代码如下:/// &summary&/// MD5 加密静态方法/// &/summary&/// &paramname="EncryptString"&待加密的密文&/param&///&returns&returns&/returns&public static string MD5Encrypt(string EncryptString){if (string.IsNullOrEmpty(EncryptString)) { throw (newException("密文不得为空")); }MD5 m_ClassMD5 = new MD5CryptoServiceProvider();string m_strEncrypt = "";try{m_strEncrypt =BitConverter.ToString(puteHash(Encoding.Default.GetBytes(EncryptString))).Replace("-","");}catch (ArgumentException ex) { }catch (CryptographicException ex) { }catch (Exception ex) { }finally { m_ClassMD5.Clear(); }return m_strE}/// &summary&/// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)/// &/summary&/// &paramname="EncryptString"&待加密的密文&/param&/// &paramname="EncryptKey"&加密的密钥&/param&///&returns&returns&/returns&public static string DESEncrypt(string EncryptString, stringEncryptKey){if (string.IsNullOrEmpty(EncryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(EncryptKey)) { throw (newException("密钥不得为空")); }if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位"));}byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};string m_strEncrypt = "";DESCryptoServiceProvider m_DESProvider = newDESCryptoServiceProvider();try{byte[] m_btEncryptString =Encoding.Default.GetBytes(EncryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_cstream = new CryptoStream(m_stream,m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey),m_btIV), CryptoStreamMode.Write);m_cstream.Write(m_btEncryptString, 0,m_btEncryptString.Length);m_cstream.FlushFinalBlock();m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_cstream.Close(); m_cstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_DESProvider.Clear(); }return m_strE}/// &summary&/// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)/// &/summary&/// &paramname="DecryptString"&待解密的密文&/param&/// &paramname="DecryptKey"&解密的密钥&/param&///&returns&returns&/returns&public static string DESDecrypt(string DecryptString, stringDecryptKey){if (string.IsNullOrEmpty(DecryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(DecryptKey)) { throw (newException("密钥不得为空")); }if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位"));}byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};string m_strDecrypt = "";DESCryptoServiceProvider m_DESProvider = newDESCryptoServiceProvider();try{byte[] m_btDecryptString =Convert.FromBase64String(DecryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_cstream = new CryptoStream(m_stream,m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey),m_btIV), CryptoStreamMode.Write);m_cstream.Write(m_btDecryptString, 0,m_btDecryptString.Length);m_cstream.FlushFinalBlock();m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_cstream.Close(); m_cstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_DESProvider.Clear(); }return m_strD}/// &summary&/// RC2 加密(用变长密钥对大量数据进行加密)/// &/summary&/// &paramname="EncryptString"&待加密密文&/param&/// &paramname="EncryptKey"&加密密钥&/param&///&returns&returns&/returns&public static string RC2Encrypt(string EncryptString, stringEncryptKey){if (string.IsNullOrEmpty(EncryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(EncryptKey)) { throw (newException("密钥不得为空")); }if (EncryptKey.Length & 5 || EncryptKey.Length& 16) { throw (new Exception("密钥必须为5-16位")); }string m_strEncrypt = "";byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};RC2CryptoServiceProvider m_RC2Provider = newRC2CryptoServiceProvider();try{byte[] m_btEncryptString =Encoding.Default.GetBytes(EncryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_cstream = new CryptoStream(m_stream,m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey),m_btIV), CryptoStreamMode.Write);m_cstream.Write(m_btEncryptString, 0,m_btEncryptString.Length);m_cstream.FlushFinalBlock();m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_cstream.Close(); m_cstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_RC2Provider.Clear(); }return m_strE}/// &summary&/// RC2 解密(用变长密钥对大量数据进行加密)/// &/summary&/// &paramname="DecryptString"&待解密密文&/param&/// &paramname="DecryptKey"&解密密钥&/param&///&returns&returns&/returns&public static string RC2Decrypt(string DecryptString, stringDecryptKey){if (string.IsNullOrEmpty(DecryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(DecryptKey)) { throw (newException("密钥不得为空")); }if (DecryptKey.Length & 5 || DecryptKey.Length& 16) { throw (new Exception("密钥必须为5-16位")); }byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};string m_strDecrypt = "";RC2CryptoServiceProvider m_RC2Provider = newRC2CryptoServiceProvider();try{byte[] m_btDecryptString =Convert.FromBase64String(DecryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_cstream = new CryptoStream(m_stream,m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey),m_btIV), CryptoStreamMode.Write);m_cstream.Write(m_btDecryptString, 0,m_btDecryptString.Length);m_cstream.FlushFinalBlock();m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_cstream.Close(); m_cstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_RC2Provider.Clear(); }return m_strD}/// &summary&/// 3DES 加密(基于DES,对一块数据用3个不同的密钥进行三次加密,强度更高)/// &/summary&/// &paramname="EncryptString"&待加密密文&/param&/// &paramname="EncryptKey1"&密钥一&/param&/// &paramname="EncryptKey2"&密钥二&/param& ///&paramname="EncryptKey3"&密钥三&/param&///&returns&returns&/returns&public static string DES3Encrypt(string EncryptString, stringEncryptKey1, string EncryptKey2, string EncryptKey3){string m_strEncrypt = "";try{m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);}catch (Exception ex) { }return m_strE}/// &summary&/// 3DES 解密(基于DES,对一块数据用3个不同的密钥进行三次加密,强度更高)/// &/summary&/// &paramname="DecryptString"&待解密密文&/param&/// &paramname="DecryptKey1"&密钥一&/param&/// &paramname="DecryptKey2"&密钥二&/param&/// &paramname="DecryptKey3"&密钥三&/param&///&returns&returns&/returns&public staticstring DES3Decrypt(string DecryptString, string DecryptKey1, stringDecryptKey2, string DecryptKey3){string m_strDecrypt = "";try{m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);m_strDecrypt= DESDecrypt(m_strDecrypt, DecryptKey2);m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);}catch (Exception ex) { }return m_strD}/// &summary&/// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的1个实现是 Rijndael算法)/// &/summary&/// &paramname="EncryptString"&待加密密文&/param&/// &paramname="EncryptKey"&加密密钥&/param& ///&returns&&/returns& publicstatic string AESEncrypt(string EncryptString, stringEncryptKey){if (string.IsNullOrEmpty(EncryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(EncryptKey)) { throw (newException("密钥不得为空")); }string m_strEncrypt = "";byte[] m_btIV =Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");Rijndael m_AESProvider = Rijndael.Create();try{byte[] m_btEncryptString =Encoding.Default.GetBytes(EncryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_csstream = new CryptoStream(m_stream,m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey),m_btIV), CryptoStreamMode.Write);m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);m_csstream.FlushFinalBlock();m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_csstream.Close(); m_csstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_AESProvider.Clear(); }return m_strE}/// &summary&/// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的1个实现是 Rijndael算法)/// &/summary&/// &paramname="DecryptString"&待解密密文&/param&/// &paramname="DecryptKey"&解密密钥&/param&///&returns&&/returns&public static string AESDecrypt(string DecryptString, stringDecryptKey){if (string.IsNullOrEmpty(DecryptString)) { throw (newException("密文不得为空")); }if (string.IsNullOrEmpty(DecryptKey)) { throw (newException("密钥不得为空")); }string m_strDecrypt = "";byte[] m_btIV =Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");Rijndael m_AESProvider = Rijndael.Create();try{byte[] m_btDecryptString =Convert.FromBase64String(DecryptString);MemoryStream m_stream = new MemoryStream();CryptoStream m_csstream = new CryptoStream(m_stream,m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey),m_btIV), CryptoStreamMode.Write);m_csstream.Write(m_btDecryptString,0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());m_stream.Close(); m_stream.Dispose();m_csstream.Close(); m_csstream.Dispose();}catch (IOException ex) { }catch (CryptographicException ex) { }catch (ArgumentException ex) { }catch (Exception ex) { }finally { m_AESProvider.Clear(); }return m_strD}2、数据加密和解密简单代码调用如下:Response.Write("&br&-----------MD5加密---------------&br&"); Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));Response.Write("&br&-----------DES加密---------------&br&"); Response.Write(SDKSecurity.DESEncrypt("仰天一笑","anson-xu")); Response.Write("&br&-----------DES解密---------------&br&"); Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==","anson-xu"));Response.Write("&br&-----------AES加密---------------&br&");Response.Write(SDKSecurity.AESEncrypt("仰天一笑","ansonxuyu")); Response.Write("&br&-----------AES解密---------------&br&"); Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==","ansonxuyu"));3、数据加密和解密调用后运行效果图如下:ASP.NET(C#)常用数据加密和解密方法源代码免费下载:源代码免费下载点击此处&&,如果下载不了,可以发邮件至欢迎您转载分享:
更多精彩:}

我要回帖

更多关于 pdf加密文件怎么解密 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信