原问题2:
发现加密类RijndaelManaged的问题,根据MSDN的这个例子发现的问题,例子源码(VS2003)
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemSecurityCryptographyRijndaelManagedClassTopic.htm
问题描述:在最后的Console.WriteLine("Round Trip: {0}", roundtrip );这行代码后面追加下面的代码
Console.WriteLine(original.Length == roundtrip.Length);
运行一下看看,按照正常想法应该是解密后的内容应该与原文完全相同,输出True,但是却输出False。
这两个问题都差不多,都是因为不了解对称加密(AES/DES等)的加密原理,而误认为.net framework的加密算法有问题。
AES/DES都是块式加密的(块的大小等于密钥的大小)。对于AES算法,其密钥大小为128bit(16byte),故每块16byte,在加密之前要对加密数据进行填充(例如:如果要用AES算法加密100byte的数据,则填充成112byte构成16的倍数,加密之后的数据大小为112byte;如果要加密112byte,则要另外填充16byte,构成128byte,加密之后的数据大小为128byte)。现在回过头来看看问题2,我们将MSDN中的代码改成下面这样则可以返回true了:
fromEncrypt = new byte[toEncrypt.Length];//MSDN中使用的是encrypted.Length;
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
这是因为按照MSDN的示例执行加密后,由于填充的缘故,encrypted的长度要比toEncrypt大,而MSDN的示例中是以encrypted的长度来设定fromEncrypt的长度,故解密之后fromEncrypt后面有一段是空的,得到的解密后字符串roundtrip中的后面有一截是以'/0'进行填充了,故长度不一样了。而使用toEncrypt.Length来设定fromEncrypt的长度,则申请的空间刚刚够用,不用填充。
下面再来看看第一个问题:每次取1024byte进行加密,加密时系统会自动填充8个byte(DES的密钥长度为64bit),加密后得到1024+8byte的数据,所以你解密的时候要每次取1024+8byte进行解密。而对于加密前文件大小小于或等于1016byte的文件,加密后大小小于或等于1024byte,故循环只执行一次,按照问题中的解密代码可以解密成功,而对于再大一点或更大的文件,则必然解密失败,所以才出现问题中的“对于有的字符串就对,有的就不对”。修正后的测试代码如下:
补充 :.Net数据安全
1.填充模式(Padding Mode): None,PKCS7,Zeros.
2.加密模式(Cipher Mode):CBC,CFB,CTS,ECB,OFB.
3.对称加密:
DESCryptoServiceProvider: Key- 64bit IV- 64bit
RC2CryptoServiceProvider: Key-128bit IV- 64bit
DijndaeManaged(AES) : Key-256/128/192bit IV-128bit
TripDESCryptoServiceProvider: key-192bit IV- 64bit
CreateDecryptor()构造解密器,CreateEncryptor()构造加密器。
4.非对称加密:
DSA:KeySize=1024bit
DSASignatrueFommatter类:创建数字签名;
DSASignatrueDefommatter类:验证数字签名;
RSA:KeySize=1024bit
加密:RSA.Encrypt(byte[] DataEncrypt,bool Padding)
解密:RSA.Decrypt(byte[] DataEncrypt,bool Padding)
导出/导入密钥:RSA.ToXmlString(bool)/RSA.FromXml(string)
签名/验证:RSA.SignData()/RSA.VerifyData()
5.消息摘要:
HMACSHA1
MACTripleDES
MD5CryptoServiceProvider(128bit)
SHA1Managed(160bit)
SHA256Managed(256bit)
SHA384Managed(384bit)
SHA512Managed(512bit)
参考文献:
[1] MSDN
[2] 《应用密码学》Bruce Schneier[著],吴世忠等[译]