包含md2.pub的词条

http://www.itjxue.com  2023-01-16 13:11  来源:未知  点击次数: 

在公开密钥密码体制中,HASH算法的作用是

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

数学表述为:h = H(M) ,其中H( )--单向散列函数,M--任意长度明文,h--固定长度散列值。

在信息安全领域中应用的Hash算法,还需要满足其他关键特性:

第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应的M=H-1(h)不可行。这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的 Hash 又被称为"消息摘要(message digest)",就是要求能方便的将"消息"进行"摘要",但在"摘要"中无法得到比"摘要"本身更多的关于"消息"的信息。

第二是抗冲突性(collision-resistant),即在统计上无法产生2个散列值相同的预映射。给定M,计算上无法找到M',满足H(M)=H(M') ,此谓弱抗冲突性;计算上也难以寻找一对任意的M和M',使满足H(M)=H(M') ,此谓强抗冲突性。要求"强抗冲突性"主要是为了防范所谓"生日攻击(birthday attack)",在一个10人的团体中,你能找到和你生日相同的人的概率是2.4%,而在同一团体中,有2人生日相同的概率是11.7%。类似的,当预映射的空间很大的情况下,算法必须有足够的强度来保证不能轻易找到"相同生日"的人。

第三是映射分布均匀性和差分分布均匀性,散列结果中,为 0 的 bit 和为 1 的 bit ,其总数应该大致相等;输入中一个 bit 的变化,散列结果中将有一半以上的 bit 改变,这又叫做"雪崩效应(avalanche effect)";要实现使散列结果中出现 1bit 的变化,则输入中至少有一半以上的 bit 必须发生变化。其实质是必须使输入中每一个 bit 的信息,尽量均匀的反映到输出的每一个 bit 上去;输出中的每一个 bit,都是输入中尽可能多 bit 的信息一起作用的结果。

Damgard 和 Merkle 定义了所谓"压缩函数(compression function)",就是将一个固定长度输入,变换成较短的固定长度的输出,这对密码学实践上 Hash 函数的设计产生了很大的影响。Hash函数就是被设计为基于通过特定压缩函数的不断重复"压缩"输入的分组和前一次压缩处理的结果的过程,直到整个消息都被压缩完毕,最后的输出作为整个消息的散列值。尽管还缺乏严格的证明,但绝大多数业界的研究者都同意,如果压缩函数是安全的,那么以上述形式散列任意长度的消息也将是安全的。这就是所谓 Damgard/Merkle 结构:

在下图中,任意长度的消息被分拆成符合压缩函数输入要求的分组,最后一个分组可能需要在末尾添上特定的填充字节,这些分组将被顺序处理,除了第一个消息分组将与散列初始化值一起作为压缩函数的输入外,当前分组将和前一个分组的压缩函数输出一起被作为这一次压缩的输入,而其输出又将被作为下一个分组压缩函数输入的一部分,直到最后一个压缩函数的输出,将被作为整个消息散列的结果。

MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。

1) MD4

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。它的安全性不像RSA那样基于数学假设,尽管 Den Boer、Bosselaers 和 Dobbertin 很快就用分析和差分成功的攻击了它3轮变换中的 2 轮,证明了它并不像期望的那样安全,但它的整个算法并没有真正被破解过,Rivest 也很快进行了改进。

下面是一些MD4散列结果的例子:

MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0

MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24

MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d

MD4 ("message digest") = d9130a8164549fe818874806e1c7014b

MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9

MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 043f8582f241db351ce627e153e7f0e4

MD4 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536

2) MD5

MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。它较MD4所做的改进是:

1) 加入了第四轮

2) 每一步都有唯一的加法常数;

3) 第二轮中的G函数从((X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z)) 变为 ((X ∧ Z) ∨ (Y ∧ ~Z))以减小其对称性;

4) 每一步都加入了前一步的结果,以加快"雪崩效应";

5) 改变了第2轮和第3轮中访问输入子分组的顺序,减小了形式的相似程度;

6) 近似优化了每轮的循环左移位移量,以期加快"雪崩效应",各轮的循环左移都不同。

尽管MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

消息首先被拆成若干个512位的分组,其中最后512位一个分组是"消息尾+填充字节(100...0)+64 位消息长度",以确保对于不同长度的消息,该分组不相同。64位消息长度的限制导致了MD5安全的输入长度必须小于264bit,因为大于64位的长度信息将被忽略。而4个32位寄存器字初始化为A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210,它们将始终参与运算并形成最终的散列结果。

接着各个512位消息分组以16个32位字的形式进入算法的主循环,512位消息分组的个数据决定了循环的次数。主循环有4轮,每轮分别用到了非线性函数

F(X, Y, Z) = (X ∧ Y) ∨ (~X ∧ Z)

G(X, Y, Z) = (X ∧ Z) ∨ (Y ∧ ~Z)

H(X, Y, Z) =X ⊕ Y ⊕ Z

I(X, Y, Z) = X ⊕ (Y ∨ ~Z)

这4轮变换是对进入主循环的512位消息分组的16个32位字分别进行如下操作:将A、B、C、D的副本a、b、c、d中的3个经F、G、H、I运算后的结果与第4个相加,再加上32位字和一个32位字的加法常数,并将所得之值循环左移若干位,最后将所得结果加上a、b、c、d之一,并回送至ABCD,由此完成一次循环。

所用的加法常数由这样一张表T[i]来定义,其中i为1...64,T[i]是i的正弦绝对值之4294967296次方的整数部分,这样做是为了通过正弦函数和幂函数来进一步消除变换中的线性性。

当所有512位分组都运算完毕后,ABCD的级联将被输出为MD5散列的结果。下面是一些MD5散列结果的例子:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e

MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0

MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b

MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f

MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a

参考相应RFC文档可以得到MD4、MD5算法的详细描述和算法的C源代码。

3) SHA1 及其他

SHA1是由NIST NSA设计为同DSA一起使用的,访问可以得到它的详细规范--[/url]"FIPS PUB 180-1 SECURE HASH STANDARD"。它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。因为它将产生160bit的散列值,因此它有5个参与运算的32位寄存器字,消息分组和填充方式与MD5相同,主循环也同样是4轮,但每轮进行20次操作,非线性运算、移位和加法运算也与MD5类似,但非线性函数、加法常数和循环左移操作的设计有一些区别,可以参考上面提到的规范来了解这些细节。下面是一些SHA1散列结果的例子:

SHA1 ("abc") = a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d

SHA1 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1

其他一些知名的Hash算法还有MD2、N-Hash、RIPE-MD、HAVAL等等。上面提到的这些都属于"纯"Hash算法。还有另2类Hash算法,一类就是基于对称分组算法的单向散列算法,典型的例子是基于DES的所谓Davies-Meyer算法,另外还有经IDEA改进的Davies-Meyer算法,它们两者目前都被认为是安全的算法。另一类是基于模运算/离散对数的,也就是基于公开密钥算法的,但因为其运算开销太大,而缺乏很好的应用前景。

没有通过分析和差分攻击考验的算法,大多都已经夭折在实验室里了,因此,如果目前流行的Hash算法能完全符合密码学意义上的单向性和抗冲突性,就保证了只有穷举,才是破坏Hash运算安全特性的唯一方法。为了对抗弱抗冲突性,我们可能要穷举个数和散列值空间长度一样大的输入,即尝试2^128或2^160个不同的输入,目前一台高档个人电脑可能需要10^25年才能完成这一艰巨的工作,即使是最高端的并行系统,这也不是在几千年里的干得完的事。而因为"生日攻击"有效的降低了需要穷举的空间,将其降低为大约1.2*2^64或1.2*2^80,所以,强抗冲突性是决定Hash算法安全性的关键。

在NIST新的 Advanced Encryption Standard (AES)中,使用了长度为128、192、256bit 的密钥,因此相应的设计了 SHA256、SHA384、SHA512,它们将提供更好的安全性。

Hash算法在信息安全方面的应用主要体现在以下的3个方面:

1) 文件校验

我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。它常被用在下面的2种情况下:

第一是文件传送后的校验,将得到的目标文件计算 md5 checksum,与源文件的md5 checksum 比对,由两者 md5 checksum 的一致性,可以从统计上保证2个文件的每一个码元也是完全相同的。这可以检验文件传输过程中是否出现错误,更重要的是可以保证文件在传输过程中未被恶意篡改。一个很典型的应用是ftp服务,用户可以用来保证多次断点续传,特别是从镜像站点下载的文件的正确性。

更出色的解决方法是所谓的代码签名,文件的提供者在提供文件的同时,提供对文件Hash值用自己的代码签名密钥进行数字签名的值,及自己的代码签名证书。文件的接受者不仅能验证文件的完整性,还可以依据自己对证书签发者和证书拥有者的信任程度,决定是否接受该文件。浏览器在下载运行插件和java小程序时,使用的就是这样的模式。

第二是用作保存二进制文件系统的数字指纹,以便检测文件系统是否未经允许的被修改。不少系统管理/系统安全软件都提供这一文件系统完整性评估的功能,在系统初始安装完毕后,建立对文件系统的基础校验和数据库,因为散列校验和的长度很小,它们可以方便的被存放在容量很小的存储介质上。此后,可以定期或根据需要,再次计算文件系统的校验和,一旦发现与原来保存的值有不匹配,说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。TripWire就提供了一个此类应用的典型例子。

更完美的方法是使用"MAC"。"MAC" 是一个与Hash密切相关的名词,即信息鉴权码(Message Authority Code)。它是与密钥相关的Hash值,必须拥有该密钥才能检验该Hash值。文件系统的数字指纹也许会被保存在不可信任的介质上,只对拥有该密钥者提供可鉴别性。并且在文件的数字指纹有可能需要被修改的情况下,只有密钥的拥有者可以计算出新的散列值,而企图破坏文件完整性者却不能得逞。

2) 数字签名

Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。

在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。

签名方先对该数据文件进行计算其散列值,然后再对很短的散列值结果--如Md5是16个字节,SHA1是20字节,用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行计算其散列值,然后再用非对称算法验证数字签名。

对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点:

首先,数据文件本身可以同它的散列值分开保存,签名验证也可以脱离数据文件本身的存在而进行。

再者,有些情况下签名密钥可能与解密密钥是同一个,也就是说,如果对一个数据文件签名,与对其进行非对称的解密操作是相同的操作,这是相当危险的,恶意的破坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。因此,在对任何数据文件进行数字签名时,只有对其Hash值进行签名才是安全的。

3) 鉴权协议

如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

需要鉴权的一方,向将被鉴权的一方发送随机串("挑战"),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较("认证"),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。

POP3协议中就有这一应用的典型例子:

S: +OK POP3 server ready 1896.697170952@dbc.mtview.ca.us

C: APOP mrose c4c9334bac560ecc979e58001b3e22fb

S: +OK maildrop has 1 message (369 octets)

在上面的一段POP3协议会话中,双方都共享的对称密钥(鉴权口令字)是tanstaaf,服务器发出的挑战是1896.697170952@dbc.mtview.ca.us,客户端对挑战的应答是MD5("1896.697170952@dbc.mtview.ca.ustanstaaf") = c4c9334bac560ecc979e58001b3e22fb,这个正确的应答使其通过了认证。

散列算法长期以来一直在计算机科学中大量应用,随着现代密码学的发展,单向散列函数已经成为信息安全领域中一个重要的结构模块,我们有理由深入研究其设计理论和应用方法。

密文是什么 具体给我讲解一下

密文是相对于明文说的,明文其实就是你要传达的消息,而明文通过加密之后就成了密文,密文其实是信息安全的一个词汇。帮你介绍一下。

信息安全的发展历史

通信保密科学的诞生

古罗马帝国时期的Caesar密码:能够将明文信息变换为人们看不懂的字符串,(密文),当密文传到伙伴手中时,又可方便的还原为原来的明文形式。 Caesar密码由明文字母循环移3位得到。

1568年,L.Battista发明了多表代替密码,并在美国南北战争期间有联军使用。例:Vigenere密码和Beaufort密码

1854年,Playfair发明了多字母代替密码,英国在第一次世界大战中使用了此密码。例:Hill密码,多表、多字母代替密码成为古典密码学的主流。

密码破译技术(密码分析)的发展:例:以1918年W.Friedman使用重合指数破译多表代替密码技术为里程碑。 1949年C.Shannon的《保密系统的通信理论》文章发表在贝尔系统技术杂志上。这两个成果为密码学的科学研究奠定了基础。从艺术变为科学。实际上,这就是通信保密科学的诞生,其中密码是核心技术。

公钥密码学革命

25年之后,20世纪70年代,IBM公司的DES(美国数据加密标准)和1976年Diffie-Hellman,提出了公开密钥密码思想,1977年公钥密码算法RSA的提出为密码学的发展注入了新的活力。

公钥密码掀起了一场革命,对信息安全有三方面的贡献:首次从计算复杂性上刻画了密码算法的强度,突破了Shannon仅关心理论强度的局限性;他将传统密码算法中两个密钥管理中的保密性要求,转换为保护其中一格的保密性及另一格的完整性的要求;它将传统密码算法中密钥归属从通信两方变为一个单独的用户,从而使密钥的管理复杂度有了较大下降。

公钥密码的提出,注意:一是密码学的研究逐步超越了数据的通信保密范围,开展了对数据的完整性、数字签名等技术的研究;二是随着计算机和网络的发展,密码学一逐步成为计算机安全、网络安全的重要支柱,使得数据安全成为信息安全的全新内容,超越了以往物理安全占据计算机安全的主导地位状态。

访问控制技术与可信计算机评估准则

1969年,B.Lampson提出了访问控制模型。

1973年,D.Bell 和L.Lapadula,创立了一种模拟军事安全策略的计算机操作模型,这是最早也是最常用的一种计算机多级安全模型。

1985年,美国国防部在Bell-Lapadula模型的基础上提出了可信计算机评估准则(通常称为橘皮书)。按照计算机系统的安全防护能力,分成8个等级。

1987年,Clark-Wilson模型针对完整性保护和商业应用提出的。

信息保障

1998年10月,美国国家安全局(NSA)颁布了信息保障技术框架1.1版,2003年2月6日,美国国防部(DOD)颁布了信息保障实施命令8500.2,从而信息保障成为美国国防组织实施信息化作战的既定指导思想。

信息保障(IA:information assurance):通过确保信息的可用性、完整性、可识别性、保密性和抵赖性来保护信息系统,同时引入保护、检测及响应能力,为信息系统提供恢复功能。这就是信息保障模型PDRR。

protect保护、detect检测、react响应、restore 恢复

美国信息保障技术框架的推进使人们意识到对信息安全的认识不要停留在保护的框架之下,同时还需要注意信息系统的检测和响应能力。

2003年,中国发布了《国家信息领导小组关于信息安全保障工作的意见》,这是国家将信息安全提到战略高度的指导性文件

信息保密技术的研究成果:

发展各种密码算法及其应用:

DES(数据加密标准)、RSA(公开密钥体制)、ECC(椭圆曲线离散对数密码体制)等。

计算机信息系统安全模型和安全评价准则:

访问监视器模型、多级安全模型等;TCSEC(可信计算机系统评价准则)、ITSEC(信息技术安全评价准则)等。

加密(Encryption)

加密是通过对信息的重新组合,使得只有收发双方才能解码并还原信息的一种手段。

传统的加密系统是以密钥为基础的,这是一种对称加密,也就是说,用户使用同一个密钥加密和解密。

目前,随着技术的进步,加密正逐步被集成到系统和网络中,如IETF正在发展的下一代网际协议IPv6。硬件方面,Intel公司也在研制用于PC机和服务器主板的加密协处理器。

身份认证(Authentication)

防火墙是系统的第一道防线,用以防止非法数据的侵入,而安全检查的作用则是阻止非法用户。有多种方法来鉴别一个用户的合法性,密码是最常用的,但由于有许多用户采用了很容易被猜到的单词或短语作为密码,使得该方法经常失效。其它方法包括对人体生理特征(如指纹)的识别,智能IC卡和USB盘。

数字签名(Digital Signature)

数字签名可以用来证明消息确实是由发送者签发的,而且,当数字签名用于存储的数据或程序时,可以用来验证数据或程序的完整性。

美国政府采用的数字签名标准(Digital Signature Standard,DSS)使用了安全哈希运算法则。用该算法对被处理信息进行计算,可得到一个160位(bit)的数字串,把这个数字串与信息的密钥以某种方式组合起来,从而得到数字签名。

内容检查(Content Inspection)

即使有了防火墙、身份认证和加密,人们仍担心遭到病毒的攻击。有些病毒通过E-mail或用户下载的ActiveX和Java小程序(Applet)进行传播,带病毒的Applet被激活后,又可能会自动下载别的Applet。现有的反病毒软件可以清除E-mail病毒,对付新型Java和ActiveX病毒也有一些办法,如完善防火墙,使之能监控Applet的运行,或者给Applet加上标签,让用户知道他们的来源。

介绍一些加密的知识

密钥加/解密系统模型

在1976年,Diffie及Hellman发表其论文“New Directions in Cryptography”[9]之前,所谓的密码学就是指对称密钥密码系统。因为加/解密用的是同一把密钥,所以也称为单一密钥密码系统。

这类算法可谓历史悠久,从最早的凯撒密码到目前使用最多的DES密码算法,都属于单一密钥密码系统。

通常,一个密钥加密系统包括以下几个部分:

① 消息空间M(Message)

② 密文空间C(Ciphertext)

③ 密钥空间K(Key)

④ 加密算法E(Encryption Algorithm)

⑤ 解密算法D(Decryption Algorithm)

消息空间中的消息M(称之为明文)通过由加密密钥K1控制的加密算法加密后得到密文C。密文C通过解密密钥K2控制的解密算法又可恢复出原始明文M。即:

EK1(M)=C

DK2(C)=M

DK2(EK1(M))=M

概念:

当算法的加密密钥能够从解密密钥中推算出来,或反之,解密密钥可以从加密密钥中推算出来时,称此算法为对称算法,也称秘密密钥算法或单密钥算法;

当加密密钥和解密密钥不同并且其中一个密钥不能通过另一个密钥推算出来时,称此算法为公开密钥算法。

1.凯撒密码变换

更一般化的移位替代密码变换为

加密:E(m)=(m+k) mod 26

解密:D(c)=(c-k) mod 26

2.置换密码

在置换密码中,明文和密文的字母保持相同,但顺序被打乱了。在简单的纵行置换密码中,明文以固定的宽度水平地写在一张图表纸上,密文按垂直方向读出;解密就是将密文按相同的宽度垂直地写在图表纸上,然后水平地读出明文。例如:

明文:encryption is the transformation of data into some unreadable form

密文:eiffob nsodml ctraee rhmtuf yeaano pttirr trinem iaota onnod nsosa

20世纪40年代,Shannon提出了一个常用的评估概念。特认为一个好的加密算法应具有模糊性和扩散性。

模糊性:加密算法应隐藏所有的局部模式,即,语言的任何识别字符都应变得模糊,加密法应将可能导致破解密钥的提示性语言特征进行隐藏;

扩散性:要求加密法将密文的不同部分进行混合,是任何字符都不在其原来的位置。

加密算法易破解的原因是未能满足这两个Shannon条件。

数据加密标准(DES)

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,经过16次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算.

具体方法 需要图 我放不上去对不起了

可以将DES算法归结如下:

子密钥生成:

C[0]D[0] = PC–1(K)

for 1 = i = 16

{C[i] = LS[i](C[i?1])

D[i] = LS[i](D[i?1])

K[i] = PC–2(C[i]D[i])}

加密过程:

L[0]R[0] = IP(x)

for 1 = i = 16

{L[i] = R[i?1]

R[i] = L[i?1] XOR f?(R[i?1], K[i])}

c= IP?1(R[16]L[16])v

解密过程:

R[16]L[16] = IP(c)

for 1 = i = 16

{R[i?1] = L[i]

L[i?1] = R[i] XOR f?(L[i], K[i])}

x= IP?1(L[0]R[0])

DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,但幸运的是当时大多数黑客并没有足够的设备制造出这种硬件设备。

在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。所以,当时DES被认为是一种十分强壮的加密方法。 但是,当今的计算机速度越来越快了,制造一台这样特殊的机器的花费已经降到了十万美元左右,所以用它来保护十亿美元的银行间线缆时,就会仔细考虑了。另一个方面,如果只用它来保护一台服务器,那么DES确实是一种好的办法,因为黑客绝不会仅仅为入侵一个服务器而花那么多的钱破解DES密文。由于现在已经能用二十万美圆制造一台破译DES的特殊的计算机,所以现在再对要求“强壮”加密的场合已经不再适用了

DES算法的应用误区

DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。

由上述DES算法介绍我们可以看到:DES算法中只用到64位密钥中的其中56位,而第8、16、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,..... .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。

A5 算 法

序列密码简介

序列密码又称流密码,它将明文划分成字符(如单个字母)或其编码的基本单元(如0、1),然后将其与密钥流作用以加密,解密时以同步产生的相同密钥流实现。

序列密码强度完全依赖于密钥流产生器所产生的序列的随机性和不可预测性,其核心问题是密钥流生成器的设计。而保持收发两端密钥流的精确同步是实现可靠解密的关键技术。

A5算法

A5算法是一种序列密码,它是欧洲GSM标准中规定的加密算法,用于数字蜂窝移动电话的加密,加密从用户设备到基站之间的链路。A5算法包括很多种,主要为A5/1和A5/2。其中,A5/1为强加密算法,适用于欧洲地区;A5/2为弱加密算法,适用于欧洲以外的地区。这里将详细讨论A5/1算法。

A5/1算法的主要组成部分是三个长度不同的线性反馈移位寄存器(LFSR)R1、R2和R3,其长度分别为19、22和23。三个移位寄存器在时钟的控制下进行左移,每次左移后,寄存器最低位由寄存器中的某些位异或后的位填充。各寄存器的反馈多项式为:

R1:x18+x17+x16+x13

R2:x21+x20

R3:x22+x21+x20+x7

A5算法的输入是64位的会话密钥Kc和22位的随机数(帧号)。

IDEA

IDEA即国际数据加密算法,它的原型是PES(Proposed Encryption Standard)。对PES改进后的新算法称为IPES,并于1992年改名为IDEA(International Data Encryption Algorithm)。

IDEA是一个分组长度为64位的分组密码算法,密钥长度为128位,同一个算法即可用于加密,也可用于解密。

IDEA的加密过程包括两部分:

(1) 输入的64位明文组分成四个16位子分组:X1、X2、X3和X4。四个子分组作为算法第一轮的输入,总共进行八轮的迭代运算,产生64位的密文输出。

(2) 输入的128位会话密钥产生八轮迭代所需的52个子密钥(八轮运算中每轮需要六个,还有四个用于输出变换)

子密钥产生:输入的128位密钥分成八个16位子密钥(作为第一轮运算的六个和第二轮运算的前两个密钥);将128位密钥循环左移25位后再得八个子密钥(前面四个用于第二轮,后面四个用于第三轮)。这一过程一直重复,直至产生所有密钥。

IDEA的解密过程和加密过程相同,只是对子密钥的要求不同。下表给出了加密子密钥和相应的解密子密钥。

密钥间满足:

Zi(r) ⊙ Zi(r) ?1=1 mod (216+1)

?Zi(r) ?+? Zi(r) =0 mod (216+1)

Blowfish算法

Blowfish是Bruce Schneier设计的,可以免费使用。

Blowfish是一个16轮的分组密码,明文分组长度为64位,使用变长密钥(从32位到448位)。Blowfish算法由两部分组成:密钥扩展和数据加密。

1. 数据加密

数据加密总共进行16轮的迭代,如图所示。具体描述为(将明文x分成32位的两部分:xL, xR)

for i = 1 to 16

{

xL = xL XOR Pi

xR = F(xL) XOR xR

if

{

交换xL和xR

}

}

xR = xR XOR P17

xL = xL XOR P18

合并xL 和xR

其中,P阵为18个32位子密钥P1,P2,…,P18。

解密过程和加密过程完全一样,只是密钥P1,P2,…,P18以逆序使用。

2. 函数F

把xL分成四个8位子分组:a, b, c 和d,分别送入四个S盒,每个S盒为8位输入,32位输出。四个S盒的输出经过一定的运算组合出32位输出,运算为

F(xL) =((S1,a + S2,b mod 232) XOR S3,c) + S4,d mod 232

其中,Si,x表示子分组x(x=a、b、c或d)经过Si (i=1、2、3或4)盒的输出。

没有太多地方写了,不把整个过程列上面了,就简单介绍一下好了。

GOST算法

GOST是前苏联设计的分组密码算法,为前苏联国家标准局所采用,标准号为:28147–89[5]。

GOST的消息分组为64位,密钥长度为256位,此外还有一些附加密钥,采用32轮迭代。

RC5算法

RC5是一种分组长度、密钥长度和加密迭代轮数都可变的分组密码体制。RC5算法包括三部分:密钥扩展、加密算法和解密算法。

PKZIP算法

PKZIP加密算法是一个一次加密一个字节的、密钥长度可变的序列密码算法,它被嵌入在PKZIP数据压缩程序中。

该算法使用了三个32位变量key0、key1、key2和一个从key2派生出来的8位变量key3。由密钥初始化key0、key1和key2并在加密过程中由明文更新这三个变量。PKZIP序列密码的主函数为updata_keys()。该函数根据输入字节(一般为明文),更新三个32位的变量并获得key3。

重点:单向散列函数

MD5 算 法

md5的全称是message-?digest?algorithm?5(信息-摘要算法),在90年代初由mit?laboratory?for?computer?science和rsa?data?security?inc的ronald?l.?rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一?个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些?算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电?脑。

rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到?信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果?是唯一的--既没有重复。? 为了加强算法的安全性,rivest在1990年又开发出md4算法。md4算法同样需要填补信息以确?保信息的字节长度加上448后能被512整除(信息字节长度mod?512?=?448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要?通过三个不同步骤的处理。den?boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的个人电?脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,md4就此?被淘汰掉了。? 尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。?

一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了"安全-带子"(safety-belts)的?概念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息-摘要的大小和填充?的必要条件与md4完全相同。den?boer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。? ? van?oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force?hash?function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一?个冲突。但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有?太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情?况下(非绝密应用领域。但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。

算法

MD表示消息摘要(Message Digest)。MD5是MD4的改进版,该算法对输入的任意长度消息产生128位散列值(或消息摘要。MD5算法可用图4-2表示。

对md5算法简要的叙述可以为:md5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。?

1) 附加填充位

首先填充消息,使其长度为一个比512的倍数小64位的数。填充方法:在消息后面填充一位1,然后填充所需数量的0。填充位的位数从1~512。

2) 附加长度

将原消息长度的64位表示附加在填充后的消息后面。当原消息长度大于264时,用消息长度mod 264填充。这时,消息长度恰好是512的整数倍。令M[0 1…N?1]为填充后消息的各个字(每字为32位),N是16的倍数。

3) 初始化MD缓冲区

初始化用于计算消息摘要的128位缓冲区。这个缓冲区由四个32位寄存器A、B、C、D表示。寄存器的初始化值为(按低位字节在前的顺序存放):

A: 01 23 45 67

B: 89 ab cd ef

C: fe dc ba 98

D: 76 54 32 10

4) 按512位的分组处理输入消息

这一步为MD5的主循环,包括四轮,如图4-3所示。每个循环都以当前的正在处理的512比特分组Yq和128比特缓冲值ABCD为输入,然后更新缓冲内容。

四轮操作的不同之处在于每轮使用的非线性函数不同,在第一轮操作之前,首先把A、B、C、D复制到另外的变量a、b、c、d中。这四个非线性函数分别为(其输入/输出均为32位字):

F(X,Y,Z) = (XY)((~X) Z)

G(X,Y,Z) = (XZ)(Y(~Z))

H(X,Y,Z) = XYZ

I(X,Y,Z) = Y(X(~Z))

其中,表示按位与;表示按位或;~表示按位反;表示按位异或。

此外,由图4-4可知,这一步中还用到了一个有64个元素的表T[1..64],T[i]=232×abs(sin(i)),i的单位为弧度。

根据以上描述,将这一步骤的处理过程归纳如下:

for i = 0 to N/16?1 do

/* 每次循环处理16个字,即512字节的消息分组*/

/*把第i个字块(512位)分成16个32位子分组拷贝到X中*/

for j = 0 to 15 do

Set X[j] to M[i*16+j]

end /*j 循环*/

/*把A存为AA,B存为BB,C存为CC,D存为DD*/

AA = A

BB = B

CC = C

DD = D

?/* 第一轮*/

/* 令[abcd k s i]表示操作

a = b + ((a + F(b,c,d) + X[k] + T[i]) s)

其中,Ys表示Y循环左移s位*/

/* 完成下列16个操作*/

[ABCD 0 7 1 ?] [DABC 1 12 2 ?] [CDAB 2 17 3 ?] [BCDA 3 22 4 ?]

[ABCD 4 7 5 ?] [DABC 5 12 6 ?] [CDAB 6 17 7 ?] [BCDA 7 22 8 ?]

[ABCD 8 7 9 ?] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]

[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

/* 第二轮*/

/*令[abcd k s i]表示操作

a = b + ((a + G(b,c,d) + X[k] + T[i]) s)*/

/*完成下列16个操作*/

[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]

[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]

[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]

[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

/*第三轮*/

/*令[abcd k s t]表示操作

a = b + ((a + H(b,c,d) + X[k] + T[i]) s)*/

/*完成以下16个操作*/

[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]

[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]

[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]

[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

/*第四轮*/

/*令[abcd k s t]表示操作

a = b + ((a + I(b,c,d) + X[k] + T[i]) s) */

/*完成以下16个操作*/

[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]

[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]

[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]

[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

A = A + AA

B = B + BB

C = C + CC

D = D + DD

end /*i循环*/

5) 输出

由A、B、C、D四个寄存器的输出按低位字节在前的顺序(即以A的低字节开始、D的高字节结束)得到128位的消息摘要。

以上就是对MD5算法的描述。MD5算法的运算均为基本运算,比较容易实现且速度很快。

安全散列函数(SHA)

算法

SHA是美国NIST和NSA共同设计的安全散列算法(Secure Hash Algorithm),用于数字签名标准DSS(Digital Signature Standard)。SHA的修改版SHA–1于1995年作为美国联邦信息处理标准公告(FIPS PUB 180–1)发布[2]。

(责任编辑:IT教学网)

更多

推荐mac苹果系统文章