UML软件工程组织 |
安全第一:.NET加密技术指南(2) |
作者:仙人掌工作室 本文选自:赛迪网 2003年04月14日 |
四、执行加密/解密 .NET加密技术要求密钥有确定的长度,例如,DES(Data Encryption Standard)函数要求密钥的长度是64位,Rijndael则要求128、192或256位长度的密钥。密钥越长,加密强度越高。对于DES之外的加密算法,查询LegalKeySizes属性即可得到它允许的密钥长度,包括MinSize(支持的最小密钥长度)、MaxSize(最大密钥长度)、SkipSize(增量)。SkipSize表示密钥最大长度和最小长度之间可用长度的间隔,例如,Rijndael算法的SkipSize值是64位。 利用下面的代码可以得到密钥的长度信息: ' 创建DES加密对象 MsgBox("加密类型=" & des.ToString() & Chr(13) & "minsize
= " & fd(0).MinSize & Chr(13) & _
图二
图三 说明:DES算法要求输入一个8字节的密码,但实际使用的密钥只有56位(7个字节),每一个字节的最后一位不用(它作为校验位使用,但不用于实际的加密过程)。 下面的代码开始生成本文示例程序的密钥: Public Class Form1
Sub CreateKey(ByVal strKey As String)
那么,初始向量究竟起什么作用呢?这个字节数组有8个元素,就象密钥一样,但向量和密钥的作用是不同的,向量用来避免DES之类的算法一个特有的问题。在DES之类的算法中,原始数据被分成8字节一块然后分别处理。DES在加密一块数据时,要用到前一块数据的模式,也就是说,如果改动了原始数据中第一块的某个字符,所有后继的块的内容都将随之改变,从而避免了一系列相连接的块中出现重复块的问题。 例如,假设你一时高兴,发了一个邮件,内容只有几个重复的单词“Melanie! Melanie! Melanie! Melanie!”,在密钥和块序列中前一块的共同作用下,加密之后的密文不会出现重复现象。然而,进一步考虑这个加密过程可以发现,如果用同一个密钥加密多个邮件,且邮件开头的问候语都相同,则邮件开头的一部分很容易受到攻击。由于这个原因,我们用初始向量来模拟前一个块。 本文加密/解密工具中的下面这段代码示范了如何加密文件: Sub Encrypt(ByVal inName As String , ByVal outName As String ) ' 创建加密对象 Catch e As Exception
加密过程与解密过程的唯一重要区别是,执行解密时,我们将使用DESCryptoServiceProvider对象的另一个方法CreateDecryptor,除此之外,两者其余的处理步骤(包括参数,文件流,等等)基本相同。 五、防止破解 黑客和密码专家破解加密文件的办法主要有两个,第一是搜索密文是否有重复现象,第二是用暴力破解法获得密钥。首先我们考虑一下初始向量如何防止重复现象,然后再探讨一下防止暴力破解的关键问题。 破解密文的第一种方式是搜索样本——特别是重复的样本。人们在写信的时候总是喜欢用同样的文字开头,例如“亲爱的XXX”、“Dear Sir”等,如果多个邮件的开头文字相同且通过同一密钥加密,则每个密文信件的开头也相同。假设Antonio写给Melanie的所有加密信件都有相同的问候语“@4^F (2$@Fx”,解密者就会首先检查开头的几个单词是不是“Dear Melanie”。解密机密文件的一个重要步骤就是猜测文件中应当会出现的几个单词,所以我们不应该给解密者提供这种方便。在本文的示例中,初始向量的内容被附加到文件的开头,从而防止了出现重复现象。只有信件的开头才容易受到此类攻击。 计算机的运算速度和精度要远远超过人,特别擅长处理一些重复的任务,例如尝试每一种可能的密钥组合最终破解密钥。DES加密算法本身是不安全的,这种加密算法早在70年代就已经公之于众。而且,破解者如果想要让搜索密钥的过程自动化,同样可以方便地运用.NET的DESCryptoServiceProvider类。 对于一个128位、结合运用密钥/初始向量的加密方案,计算机尝试每一种可能的密钥组合要花多少时间?专家们的看法并不一致,有人认为需要数月,也有人认为装有专用硬件的价值6位数的计算机每秒能够验证数十亿个密钥,破解DES密文只需数小时。如果你的机密值得花数月时间去破解,那么最好改用TripleDES或其他加密算法。从TripleDES的名字也可以猜出,这种加密方式采用三重数据加密标准算法,所以密钥的长度是192位,而不是64位的DES密钥。记住,在其他条件相同的情况下,密钥越长,安全程度越高。 结束语:现在你已经了解了.NET DES加密算法的使用过程,接下去可以研究.NET的其他安全功能,包括极具吸引力的公用密钥加密方案。虽然公用密钥加密方案执行起来速度慢一些,但加密效果一般要比TripleDES好。本人没有什么机密值得运用DES之外的算法,不过你的要求可能有所不同。
|
版权所有:UML软件工程组织 |