加密和解密(1):常用数据加密和解密方法汇总(3)

byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray); public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV) { // 建立一个MemoryStream,这里面存放加密后的数据流 MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray); // 使用MemoryStream 和key、IV新建一个CryptoStream 对象 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read); // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[] byte[] DecryptDataArray = new byte[EncryptedDataArray.Length]; // 把解密后的数据读入到DecryptDataArray csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length); msDecrypt.Close(); csDecrypt.Close(); return DecryptDataArray; }

有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

“Here is some data to encrypt. 这里是一些要加密的数据。”

转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

"Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

5、 从编码字节流转成字符串明文 

// 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

plainTextString = sEncoding.GetString(finalPlainTextArray);

六、非对称加密之RSA加密和解密的讲解 

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

  RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

  RSA的缺点主要有:

A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/73e38c6af0eebbf8afc969c9d1c1ee2f.html