2.1.1专业术语
发送者和接收者
假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。
2.1.2消息和加密
消息被称为明文。用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。图1.1表明了这个过程。
(如果你遵循ISO 7498-2标准,那就用到术语“译成密码(encipher)”和“解译密码(decipher)”。某些文化似乎认为术语“加密(encrypt)”和“解密(decrypt)”令人生厌,如同陈年腐尸。)
图1.1 加密和解密
使消息保密的技术和科学叫做密码编码学,从事此行的叫密码编码者,密码分析者是从事密码分析的专业人员,密码分析学就是破译密文的科学和技术,即揭穿伪装。作为数学的一个分支的密码学包括密码编码学和密码分析学两者,精于此道的人称为密码学家,现代的密码学家通常也是理论数学家。
明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单地二进制数据(除了这一章节外,这本书本身只涉及二进制数据和计算机密码学)。明文可被传送或存储,无论在哪种情况,M指待加密的消息。
密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。加密函数E作用于M得到密文C,用数学表示为:
E(M)=C.
相反地,解密函数D作用于C产生M
D(C)=M.
先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:
D(E(M))=M
2.1.3鉴别、完整性和抗抵赖
除了提供机密性外,密码学通常有其它的作用:.
-鉴别
消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。
-完整性
消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。
-抗抵赖
发送者事后不可能虚假地否认他发送的消息。
这些功能是通过计算机进行社会交流,至关重要的需求,就象面对面交流一样。某人是否就是他说的人;某人的身份证明文件(驾驶执照、医学学历或者护照)是否有效;声称从某人那里来的文件是否确实从那个人那里来的;这些事情都是通过鉴别、完整性和抗抵赖来实现的。
2.1.4算法和密钥
密码算法也叫密码,是用于加密和解密的数学函数。(通常情况下,有两个相关的函数:一个用作加密,另一个用作解密)
如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。
更糟的是,受限制的密码算法不可能进行质量控制或标准化。每个用户组织必须有他们自己的唯一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他们是否拥有安全的算法。
尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。
现代密码学用密钥解决了这个问题,密钥用K表示。K可以是很多数值里的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:
EK(M)=C
DK(C)=M.
这些函数具有下面的特性(见图1.2):
DK(EK(M))=M.
图1.2 使用一个密钥的加/解密
图1.3 使用两个密钥的加/解密
有些算法使用不同的加密密钥和解密密钥(见图1.3),也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。
密码系统由算法、以及所有可能的明文、密文和密钥组成的。
2.1.5对称算法
对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密。对称算法的加密和解密表示为:
Ek(M)=C
Dk(C)=M
对称算法可分为两类[8]。一次只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组位进行运算,这些位组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64位――这个长度大到足以防止分析破译,但又小到足以方便作用。
这种算法具有如下的特性:
Dk(Ek(M))=M
常用的采用对称密码术的加密方案有5个组成部分
l)明文:原始信息。
2)加密算法:以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。
3)密钥:加密与解密算法的参数,直接影响对明文进行变换的结果。
4)密文:对明文进行变换的结果。
5)解密算法:加密算法的逆变换,以密文为输入、密钥为参数,变换结果为明文。
对称密码术的优点在于效率高(加/解密速度能达到数十兆/秒或更多),算法简单,系统开销小,适合加密大量数据。
尽管对称密码术有一些很好的特性,但它也存在着明显的缺陷,包括:
l)迸行安全通信前需要以安全方式进行密钥交换。这一步骤,在某种情况下是可行的,但在某些情况下会非常困难,甚至无法实现。
2)规模复杂。举例来说,A与B两人之间的密钥必须不同于A和C两人之间的密钥,否则给B的消息的安全性就会受到威胁。在有1000个用户的团体中,A需要保持至少999个密钥(更确切的说是1000个,如果她需要留一个密钥给他自己加密数据)。对于该团体中的其它用户,此种倩况同样存在。这样,这个团体一共需要将近50万个不同的密钥!推而广之,n个用户的团体需要N2/2个不同的密钥。
通过应用基于对称密码的中心服务结构,上述问题有所缓解。在这个体系中,团体中的任何一个用户与中心服务器(通常称作密钥分配中心)共享一个密钥。因而,需要存储的密钥数量基本上和团体的人数差不多,而且中心服务器也可以为以前互相不认识的用户充当“介绍人”。但是,这个与安全密切相关的中心服务器必须随时都是在线的,因为只要服务器一掉线,用户间的通信将不可能进行。这就意味着中心服务器是整个通信成败的关键和受攻击的焦点,也意味着它还是一个庞大组织通信服务的“瓶颈”
2.1.6公开密钥算法
公开密钥算法(也叫非对称算法)是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了避免与对称算法混淆,此处不用秘密密钥这个名字。
用公开密钥K加密表示为
EK(M)=C.
虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:
DK(C)=M
有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(见2.6节),尽管可能产生混淆,但这些运算可分别表示为:
EK(M)=C
DK(C)=M
2.2 LibTomCrypt密码库主要内容
2.2.1 1LibTomCrypt密码库主要包含以下内容:
1、 高级加密标准AES(Advanced Encryption Standard) Rijndael和AES候选算法:RC6, MARS, Twofish, Serpent, CAST-256。
1997年4月15日美国国家标准技术研究所NIST发起征集高级加密标准AES算法的活动,2001年11月26日,NIST正式公布Rijndael数据加密算法为高级加密标准AES, 经过多年来的分析和测试,至今没有发现AES的明显缺点,也没有找到明显的安全漏洞. AES能够抵抗目前已知的各种攻击方法。
2、 对称分组密码:IDEA, DES, Triple-DES (DES-EDE2 and DES-EDE3), DESX (DES-XEX3), RC2, RC5, Blowfish, Diamond2, TEA, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square, Skipjack。
分组密码又称为秘密钥密码或对称密码。利用分组密码对明文进行加密时,首先需要对明文进行分组,每组的长度都相同,然后对每组明文分别加密得到等长的密文,分组密码的特点是加密密钥与解密密钥相同。分组密码的安全性应该主要依赖于密钥,而不依赖于对加密算法和解密算法的保密。
3、 一般的密码模式:电子密本(ECB),密码分组链接(CBC),输出反馈(OFB)和密文反馈(CFB)。
4、 序列密码:Panama, ARC4, SEAL, WAKE, WAKE-OFB, BlumBlumShub 。
序列密码可以认为是起源于20世纪20年代的Vernam体系,当Vernam体制中的密钥序列是随机的(0,1)时,就是所谓“一次一密“密码体制。Shannon已经证明了“一次一密“密码体制在理论上是不可破译的。在序列密码中,加密和解密所用的密钥都是伪随机序列,伪随机序列的产生比较容易并且有比较成熟的数学理论工具,目前,序列密码是 世界各国的军事和外交等领域中使用的主要密码体制之一。
5、 公钥密码: RSA, DSA, ElGamal, Nyberg-Rueppel (NR), Rabin, Rabin-Williams (RW), LUC, LUCELG, DLIES (variants of DHAES), ESIGN。
6、在公钥密码体制中加秘密钥和解密密钥是不一样的,加密密钥可以公开传播而不危及密码体制的安全性。RSA公钥密码体制的安全性是基于大整数的素分解问题的难解性,ElGamal公钥密码体制的安全性是基于有限域上的离散对数问题上的难解性,而Menezes Vanstone公钥密码体制的安全性则是基于椭圆曲线上的离散对数问题的难解性。
7、公钥密码系统补丁:PKCS#1 v2.0, OAEP, PSSR, IEEE P1363 EMSA2 。
8、 密钥协商协议(key agreement schemes):Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), LUCDIF, XTR-DH 。
密钥协商是一种协议,利用这种协议,通讯双方可以在一个公开的信道上通过相互传送一些消息来共同建立一个共享的秘密密钥。在密钥协商中,双方共同建立的秘密密钥通常是双方输入消息的一个函数。
9、椭圆曲线密码:ECDSA, ECNR, ECIES, ECDH, ECMQV。
10、单向hash函数:SHA-1:安全hash算法SHA,MD2, MD4, MD5, HAVAL, RIPEMD-160, Tiger, SHA-2 (SHA-256, SHA-384, and SHA-512), Panama。
Hash函数是一种将一种任意长度的消息(message)压缩为某一固定长度的消息摘要(message digest)的函数。Hash函数可以用于数字签名和消息的完整性检测。Hash函数 MD4是由R.L.Rivest于1990年提出的。MD4的设计没有基于任何假设和密码体制。Hash函数的这种直接构造方法受到人们的广泛青睐。MD4的效率很高,非常实用。关于MD4的安全性目前还没发现非常有效的攻击方法,但是已经有人指出它的一些不足,为了克服MD4的缺陷和增强安全性,R.L.Rivest于1991年对MD4作了改进,改进后的Hash函数称为MD5。SHA即安全Hash算法是美国国家标准技术研究所(NIST)公布的安全Hash标准(SHS)中的Hash算法,1995年NIST修改SHS后将修改后的SHA称为SHA-1。SHA的设计原则与MD4的设计原则极其相似,它是MD4的一种变形。
11、消息认证码(MAC):MD5-MAC, HMAC, XOR-MAC, CBC-MAC, DMAC。
消息认证代码(MAC)并不是密码,而是校验和(通常是 32 位)的一种特殊形式,它是通过使用一个秘钥并结合一个特定认证方案而生成的,并且附加在一条消息后。消息摘要是使用单向散列函数生成的,紧密联系的数字签名是使用非对称密钥对生成并进行验证的。与这两者相比,预期的接收 方需要对秘钥有访问权,以便验证代码。
基于分组密码CBC的工作模式和CFB的工作模式的Hash函数中的密钥可以公开也可以不公开,如果密钥保密则Hash函数称为带密钥Hash函数,带密钥的Hash函数常用于产生消息认证码(MAC)对于通信双方之间传输的任意消息message,用带密钥的Hash函数H对message做变换,结果H(message)作为消息message的认证码,附在消息message的后面。消息认证码用于保证通讯双方之间传输信息的完整性,使双方确信消息没有被第三方篡改或伪造。
12、基于密码结构的Hash函数:Luby-Rackoff, MDC。
13、伪随机数发生器(PRNG): ANSI X9.17 appendix C, PGP's RandPool。
14、基于密码的密钥来源函数(password based key derivation functions):采用公开密码匙加密标准 PKCS #5 的PBKDF1 和 PBKDF2。
15、压缩和解压算法。
16、大整数和多项式快速精确算法。
17、有限域算法,包括GF(p) 和 GF(2^n)。
18、大素数的产生和验证。