密码学是研究如何隐秘地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。密码学是信息安全等相关议题(如认证、访问控制)的核心。密码学的首要目的是隐藏信息的含义,而不是隐藏信息的存在。密码学也促进了计算机科学,特别是计算机与网络安全所使用的技术,如访问控制与信息的机密性。密码是通信双方按约定的法则进行信息变换的一种重要保密手段。依照法则,变明文为密文,称为加密变换;变密文为明文,称为解密变换。
1.密码的定义
密码是指通过特定变换的方式对信息等进行加密保护、安全认证的技术、产品和服务。密码学有数千年的历史,从最开始的替换法到如今的非对称加密算法,经历了古典密码学、近代密码学和现代密码学三个阶段。密码学不仅是数学家们的智慧,更是如今网络空间安全的重要基础。密码学又分为密码编码学(Cryptography)和密码分析学(Cryptanalysis)。
2.密码系统的组成
在密码学中,一个密码体制或密码系统是指由明文、密文、密钥、加密算法和解密算法所组成的五元组。明文是指未经过任何变换处理的原始消息,通常用 m (message)或 p (plaintext)表示,所有可能的明文有限集组成明文空间,通常用 M 或 P 表示。密文是指明文加密后的消息,通常用 c (ciphertext)表示,所有可能的密文有限集组成密文空间,通常用 C 表示。密钥是指进行加密或解密操作所需的秘密/公开参数或关键信息,通常用 k (key)表示,所有可能的密钥有限集组成密钥空间通常用 K 表示。加密算法是指在密钥的作用下将明文消息从明文空间映射到密文空间的一种变换方法,该变换过程称为加密,通常用字母 E 表示,即 c = EK ( m )。解密算法是指在密钥的作用下将密文消息从密文空间映射到明文空间的一种变换方法,该变换过程称为解密,通常用字母 D 表示,即 m = DK ( c )。
3.密码学的发展历史
密码学的发展历史大致可划分为三个阶段。
阶段一(古代到19世纪末),古典密码阶段:密码学家凭借自觉和信念来进行密码设计和分析,而不是推理证明。这个时期,密码技术是一种艺术,还不是一门科学,密码学家靠手工和机械来设计密码。
阶段二(20世纪初到1975年),近代密码阶段:建立了私钥密码理论基础,从此密码学成为一门科学,计算机的出现使得基于复杂计算的密码成为可能。
阶段三(1976年至今),现代密码阶段:出现公钥密码,密码学被广泛应用到与人们息息相关的问题上。
4.密码的功能及作用
密码的功能可以概括为“五功四性”。“五功”是指“进不来”“看不懂”“改不了”“拿不走”“跑不掉”;“四性”是指机密性、完整性、真实性和不可否认性。
1)机密性是指保证信息不被泄露给非授权的个人、计算机等实体的性质。主要由对称加密算法和非对称加密算法实现。
2)完整性是指保证信息来源的可靠、没有被伪造和篡改的性质。主要由对称加密算法、非对称加密算法和密码散列算法实现。
3)真实性是指应用密码算法和协议,确认信息、身份行为等是否真实的性质。主要由对称加密算法、非对称加密算法和密码散列算法实现。
4)不可否认性是指已经发生的操作行为无法否认的性质。主要由非对称加密算法实现。
被加密保护的信息系统的安全性不是建立在它的算法对于对手来说是保密的,而是应该建立在它所选择的密钥对于对手来说是保密的,这一原则被普遍认为是传统密码与现代密码的分界线。因此,现代密码算法分为对称加密算法、公钥加密算法和密码散列算法,其密码算法对外是公开的,密钥是保密的。
1.对称加密算法
对称加密算法是以一种在不知道密钥的情况下难以恢复的方式变换数据,其密钥是“对称的”,加密计算及逆计算(解密)都使用“同一个”密钥。对称密钥通常由多个实体掌握,但是,密钥不得向未授权访问该算法和密钥保护的数据的实体公开。
(1)对称加密算法原理
在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
对称加密算法的优点包括算法公开、计算量小、加密速度快、加密效率高。其缺点包括交易双方都使用同样的密钥,安全性得不到保证。每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一密钥,这会使发收信双方所拥有的密钥数量成几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。
基于对称密钥的加密算法主要有SM1、SM4、ZUC、DES、3DES(Triple DES)、AES、RC2、RC4、RC5和Blowfish等。本书只介绍最常用的对称加密算法,即DES算法、AES算法和SM4算法。
1)DES密码算法原理。数据加密标准(Data Encryption Standard,DES)算法是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中,Key为8Byte共64bit,是DES算法的工作密钥;Data也为8Byte 64bit,是要被加密或被解密的数据;Mode为DES的工作方式,有加密或解密两种。
DES算法把64bit的明文输入块变为64bit的密文输出块,它所使用的密钥也是64bit,其算法主要分为两步。
●初始置换。其功能是把输入的64bit数据块按位重新组合,并把输出分为L 0 、R 0 两部分,每部分各为32bit,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L 0 、R 0 则是换位输出后的两部分,L 0 是输出的左32位,R 0 是右32位,例如,设置换前的输入值为D 1 D 2 D 3 …D 64 ,则经过初始置换后的结果为L 0 =D 58 D 50 …D 8 ;R 0 =D 57 D 49 …D 7 。
●逆置换。经过16次迭代运算后,得到L 16 、R 16 ,将此作为输入,进行逆置换,逆置换恰好是初始置换的逆运算,由此得到密文输出。
2)AES密码算法原理。高级加密标准(Advanced Encryption Standard,AES)算法是为了取代DES算法出现的,因DES算法的有效密钥长度是56bit,因此算法的理论安全强度是2的56次方。但20世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,虽然出现了3DES加密方法,但由于它的加密时间是DES算法的3倍多,64bit的分组大小相对较小,所以还是不能满足人们对安全性的要求。于是1997年1月2日,美国国家标准技术研究所宣布希望征集高级加密标准(AES),用以取代DES。AES也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法,有5个候选算法进入最后一轮,即Rijndael、Serpent、Twofish、RC6和MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。
在密码标准征集中,所有AES候选提交方案都必须满足以下标准。
●分组大小为128bit的分组密码。
●必须支持三种密码标准:128bit、192bit和256bit。
●比提交的其他算法更安全。
●在软件和硬件实现上都很高效。
AES密码与分组密码Rijndael基本上完全一致,Rijndael分组大小和密钥大小都可以为128bit、192bit和256bit。然而AES只要求分组大小为128bit,因此只有分组长度为128bit的Rijndael才称为AES算法。本书只对分组大小128bit、密钥长度也为128bit的Rijndael算法进行分析。密钥长度为192bit和256bit的处理方式与128bit的处理方式类似,只不过密钥长度每增加64bit,算法的循环次数就增加2轮,128bit循环10轮、192bit循环12轮、256bit循环14轮。
AES中没有使用Feistel网络,其结构称为SPN结构。和DES相同,AES也由多个轮组成,其中每个轮分为SubBytes、ShiftRows、MixColumns、AddRoundKey 4个步骤,即字节代替、行移位、列混淆和轮密钥加。根据密钥长度不同,所需轮数也不同,128bit、192bit、256bit密钥分别需要10轮、12轮和14轮。第1轮之前有一次AddRoundKey,即轮密钥加,可以视为第0轮;之后1~ N -1轮,执行SubBytes、ShiftRows、MixColumns、AddRoundKey;最后一轮仅包括SubBytes、MixColumns、AddRoundKey。
3)SM4密码算法原理。2012年3月,国家密码管理局正式公布了包含SM4分组密码算法在内的《祖冲之序列密码算法》等6项密码行业标准。与DES和AES算法类似,SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字长(32bit)为单位进行加密运算,每一次迭代运算均为一轮变换函数 F 。SM4算法加/解密算法的结构相同,只是使用的轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。
●加密算法。加密算法由32次迭代运算和1次反序变换 R 组成。
设明文输入为( X 0 , X 1 , X 2 , X 3 )∈( ) 4 ,密文输出为( Y 0 , Y 1 , Y 2 , Y 3 )∈( ) 4 , 轮密钥为 rk i ∈ , i =0, 1, 2, …, 31。加密算法的运算过程如下。
(i)32次迭代运算: X i +4 = F ( X i , X i +1 , X i +2 , X i +3 , rk i ), i =0, 1, …, 31。
(ii)反序变换:( Y 0 , Y 1 , Y 2 , Y 3 )= R ( X 32 , X 33 , X 34 , X 35 )=( X 35 , X 34 , X 33 , X 32 )。
●解密算法。本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。解密时,使用轮密钥序( rk 31 , rk 30 , …, rk 0 )。
●密钥扩展算法。本算法轮密钥由加密密钥通过密钥扩展算法生成。
加密密钥 MK =( MK 0 , MK 1 , MK 2 , MK 3 ,)∈( ) 4 ,轮密钥生成方法如下。
( K 0 , K 1 , K 2 , K 3 )=( MK 0 ⊕ FK 0 , MK 1 ⊕ FK 1 , MK 2 ⊕ FK 2 , MK 3 ⊕ FK 3 ),
rk i = K i +4 = K i ⊕ T '( K i +1 ⊕ K i +2 ⊕ K i +3 ⊕ CK i ), i =0, 1, …, 31。
其中,
T 是将合成置换 T 的线性变换 L 替换为 L′ 。
L′ ( B )= B ⊕( B <<<13)⊕( B <<<23);
系统参数 FK 的取值为
FK 0 =(A3B1BAC6), FK 1 =(56AA3350), FK 2 =(677D9197), FK 3 =(B27022DC):
固定参数 CK 取值方法为
设 ck ij 为 CK i 的第 j 字节( i =0, 1, …, 31; j =0, 1, 2, 3), 即 CK i =( ck i ,0 , ck i ,1 , ck i ,2 , ck i ,3 )∈( ) 4 ,则 ck ij =(4 i + j )×7(mod256)。
固定参数 CK i ( i =0, 1, …, 31)具体值为
00070E15, 1C232A31, 383F464D, 545B6269,
70777E85, 8C939AA1, A8AFB6BD, C4CBD2D9,
E0E7EEF5, FC030A11, 181F262D, 343B4249,
50575E65, 6C737A81, 888F969D, A4ABB2B9,
COC7CED5, DCE3EAF1, F8FF060D, 141B2229,
30373E45, 4C535A61, 686F767D, 848B9299,
A0A7AEB5, BCC3CAD1, D8DFE6ED, F4FB0209,
10171E25, 2C33341, 484F565D, 646B7279.
(2)对称加密算法的加密模式
对称加密算法有多种加密模式,其中比较重要的模式有ECB、CBC、CFB、OFB。
1)ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
2)CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,如果一个分组丢失,后面的分组将全部作废(同步错误)。
3)CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位寄存器,优点是可以按字节进行加解密,也可以是 n 位的。CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。
4)OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个 n 位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。
2.公钥密码算法
公钥密码算法使用“两个”相关密钥(即公钥和私钥密钥对)来执行它们的功能;任何人都可以知道公钥,但私钥应该由“拥有”密钥对的实体单独控制。即使密钥对的公钥和私钥是相关的,也不能使用公钥的知识来推算出私钥。
(1)公钥密码算法原理
本书介绍的典型公钥密码算法包括RSA算法和SM2算法。
1)RSA密码算法原理。标准的RSA加密算法利用的是大数质因数分解困难的特点,其数学原理十分简单。找两个很大的素数 P 和 Q ,令 N = P × Q , M =( P -1)×( Q -1),找到一个和 M 互质的数 E ,再找一个整数 D 使得 E × D ≡1mod M 。其中, E 作为公钥用来加密, D 作为私钥用来解密。由 XE mod N = Y 得到密文 Y ,通过 YD mod N = X 来解密得到消息 X 。
2)SM2密码算法原理。SM2算法是一种非对称加密算法,其算法原理是基于椭圆曲线离散对数难题。SM2算法采用的椭圆曲线方程为 y 2 = x 3 + ax + b ,通过指定 a 、 b 系数,确定了唯一的标准曲线。同时,为了将曲线映射为加密算法,SM2标准中还确定了其他参数,供算法程序使用。
以方程: y 2 = x 3 -x 的曲线为例。
①首先任意取一个 P 点为基点。
②通过 P 点做切线,交于2 P 点,在2 P '点做竖线,交于2 P 点,2 P 点即为 P 点的2倍点。
③进一步, P 点和2 P 点之间做直线,交于3 P '点,在3 P '点做竖线,交于3 P 点,3 P 点即为 P 点的3倍点。
④同理,可以计算出 P 点的4、5、6…倍点。
⑤如果给定曲线上 Q 点是 P 点的一个倍点,计算 Q 是 P 的几倍点是一个非常困难的事情。
⑥更进一步理解,正向计算一个倍点是容易的,反向计算一个点是 P 点的几倍点则非常困难。
在椭圆曲线算法中,将倍数 d 作为私钥,将 Q 作为公钥。
SM2算法作为公钥算法,可以完成签名、密钥交换以及加密应用。SM2算法标准确定了标准过程。
①签名、验签计算过程。
②加密、解密计算过程。
③密钥协商计算过程。
需要说明,其他国家的标准和SM2确定的计算过程存在差异,也就是说相互之间是不兼容的。
(2)公钥密码算法应用
公钥密码算法主要应用在数字签名、身份鉴别、小数据量的加解密等场景。以数字签名和身份鉴别为例,目前,我国电子证书系统采用的双证书认证体系均采用国密SM2证书,比较典型的信息系统包括用户内网部署CA数字证书系统、统一接入平台进行身份认证系统、安全认证网关等。
3.密码散列算法
密码散列算法可以为一个相对较长的消息生成一个小的摘要值,而且这种转换是单向的,即难以从一个给定的摘要值反向推算出消息。密码散列函数一般不需要密钥参与,但是它是其他算法和密钥管理的重要基础。
(1)密码散列算法原理
密码散列算法对任意长度的消息进行压缩,输出定长的消息摘要或散列值,该过程表示为
h = H ( M )
其中, M 是输入消息; h 是经过散列算法 H 处理后的散列值,其长度通常是固定的,取决于所使用的散列算法。
这种特殊函数是关于消息 m 的单向函数 h ( m ),满足如下性质。
1)给定 h ,找出 m 满足 h ( m )= h 很难。
2)给定 m ,找出 m′ 满足 h ( m )= h ( m′ )很难。
3)直接找出 m 1 和 m 2 满足 h ( m 1 )= h ( m 2 )很难。
函数值 h ( m )称为消息 m 的摘要,由于不同的消息其摘要值千差万别,所以摘要值被形象地称为“指纹”。
(2)密码散列算法应用
密码散列算法的直接应用就是产生消息摘要,进一步可以检验数据的完整性,被广泛应用于各种安全应用和网络协议中。例如,用户收到消息后,计算其散列值,并与发送方提供的结果做比对,如果二者一致,则基本认为消息在传送过程中没有遭到篡改(由于“抗第二原像攻击”的性质)。需要注意的是,单独使用散列算法并不能保证数据的完整性,因为在传输信道不安全的情况下,攻击者可以将消息和散列值一同篡改,即在修改或替换消息后重新计算一个散列值。
因此,用于完整性保护时,散列算法常常与密钥一同使用(或增加随机值),生成的散列值称为MAC,这样的散列算法称为带密钥的散列算法(Hash-based Message Authentication Code,HMAC)。此外,散列算法也与公钥密码算法一同使用来产生数字签名。
密码协议(Cryptographic Protocol)是使用密码学的协议。密码协议包含某种密码算法,但通常协议的目的不仅仅是简单的机密性。参与协议的各方可能为了计算一个数值想共享他们各自的秘密部分,共同产生随机系列,确定相互的身份或者同时签署合同。在协议中使用密码的目的是防止或者发现欺骗和窃听者。
在某些协议中,参与者中的一个或几个有可能欺骗其他人,也可能存在窃听者并且窃听者可能暗中破坏协议或获悉一些秘密信息。某些协议之所以会失败,是因为设计者对需求定义得不是很完备,还有一些原因是协议的设计者分析得不够充分。
常见的密码协议包括SSL协议、IPSec协议。
1.安全套接层协议
安全套接层(Secure Sockets Layer,SSL)协议是网景(Netscape)公司提出的基于Web应用的安全协议。
SSL协议指定了一种在应用程序协议(如HTTP、Telnet、NNTP和FTP等)和TCP/IP之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。
SSL VPN网关适合应用于中小企业规模,满足其企业移动用户、分支机构、供应商、合作伙伴等企业资源(如基于Web的应用、企业邮件系统、文件服务器、C/S应用系统等)安全接入服务。企业利用自身的网络平台,创建一个增强安全性的企业私有网络。SSL VPN客户端的应用是基于标准Web浏览器内置的加密套件与服务器协商并确认相应的加密算法,即经过授权的用户只要能上网就能够通过浏览器接入服务器建立SSL安全隧道。
2.网络层安全协议(IPSec)
IPSec由IETF制定,面向TCMP,它为IPv4和IPv6提供基于加密安全的协议。
IPSec的主要功能为加密和认证,为了进行加密和认证,IPSec还需要有密钥管理和交换的功能,以便为加密和认证提供所需要的密钥并对密钥的使用进行管理。以上三方面的工作分别由AH、ESP和IKE(Internet Key Exchange,Internet密钥交换)三个协议规定。在介绍这三个协议前,先引入一个非常重要的术语安全关联(Security Association,SA)。安全关联是指安全服务与它服务的载体之间的一个“连接”。AH和ESP都需要使用SA,而IKE的主要功能是SA的建立和维护。要实现AH和ESP,都必须提供对SA的支持。通信双方如果要用IPSec建立一条安全的传输通路,需要事先协商好将要采用的安全策略,包括使用的加密算法、密钥、密钥的生存期等。当双方协商好使用的安全策略后,就可以说双方建立了一个SA。SA就是能向其上的数据传输提供某种IPSec安全保障的一个简单连接,可以由AH或ESP提供。当给定了一个SA,就确定了IPSec要执行的处理,如加密、认证等。SA可以进行两种方式的组合,分别为传输临近和嵌套隧道。
IPSec的工作原理类似于包过滤防火墙,可以看作对包过滤防火墙的一种扩展。当接收到一个IP数据包时,包过滤防火墙使用其头部在一个规则表中进行匹配。当找到一个匹配的规则时,包过滤防火墙就按照该规则制定的方法对接收到的IP数据包进行处理。这里的处理工作只有两种:丢弃或转发。IPSec通过查询安全策略数据库(Security Policy Database,SPD)决定对接收到的IP数据包的处理。但是IPSec不同于包过滤防火墙的是,对IP数据包的处理方法除了丢弃、直接转发(绕过IPSec)外,还有一种,即进行IPSec处理。这种方法提供了比包过滤防火墙更进一步的网络安全性。进行IPSec处理意味着对IP数据包进行加密和认证。包过滤防火墙只能控制来自或去往某个站点的IP数据包的通过,可以拒绝来自某个外部站点的IP数据包访问某些内部站点,也可以拒绝某个内部站点对某些外部网站的访问。但是包过滤防火墙不能保证由内部网络出去的数据包不被截取,也不能保证进入内部网络的数据包未经过篡改。只有在对IP数据包实施了加密和认证后,才能保证在外部网络传输的数据包的机密性、真实性、完整性,通过互联网进行安全的通信才成为可能。IPSec既可以只对IP数据包进行加密,或只进行认证,也可以同时实施二者。但无论是进行加密还是进行认证,IPSec都有两种工作模式,一种是隧道模式,另一种是传输模式。
密钥管理的内容覆盖了密钥的整个生命周期,所有管理过程都是无误地维护密钥从生成到销毁的安全性与实用性。密钥管理主要包括以下几个方面。
1.密钥的生成
不同种类的密钥产生的方法也不一样。基本密钥是控制与产生其他加密密钥的密钥,它的安全性特别关键,一定要确保它的完全随机性、不可重复性与不可预测性。会话密钥可借助某加密算法动态产生。密钥加密密钥可由密钥生成器自动产生,常用的密钥生成器有随机比特或伪随机数两种生成器,也可借助主密钥管控下的某种算法生成。任意密钥生成器生成的密钥均存在周期性和被预测的危险,作为主密钥不适合。主密钥一般采用像掷硬币、掷骰子或在随机数表中选数等途径产生,以确保密钥的随机性,避免可预测性的出现。
2.密钥的保存
密码系统中生成的密钥众多,且它们多数时间是静态的,所以密钥的保存为密钥管理的重要内容。密钥的存储一定要确保其机密性、认证性与完整性,避免遭受泄露与篡改。具体保存方法有人工记忆、外部记忆装置、密钥恢复、系统内部保存、把密钥存储在硬件的介质上等。这些方法中最简单、最安全的方法是把自己的口令与密码记在大脑里,只是使用不方便,一定得有人工干预。另一种简单的方法是借助易记的口令进行加密保存,使密钥永远不以未加密的方式出现在设备外,可提高实际使用密钥的安全强度。另外,相对好的存储措施是把密钥存于磁条卡上,或嵌进ROM(只读存储器)芯片里,这样用户在使用时自己都不知道密钥是什么,还能把密钥分成两半,就是说磁条卡上与终端机中各存二分之一。
3.密钥的分配
密钥的分配指的是使用者获取密钥的过程。典型的密钥分配方式主要有集中式与分布式。集中式分配主要通过密钥分配中心按照用户要求传送密钥,此时需借主密钥对传递会话密钥进行保护,并由安全渠道传送主密钥。分布式分配由网络中各主机相互间的协商来分配密钥,例如可把密钥分解为多个部分,借秘密分享的手段传递,只需有部分到达就能恢复,这种方法适合在不安全的信道中传输密钥使用。
4.密钥的撤销
密钥均有一定有效期,密钥使用时间不能过长,否则泄露的可能性会加大。只要被泄露,用此密钥的时间越久,损失就会越大。因此,用了密钥一段时间后,若和密钥有关的系统存在安全问题,存在某一密钥已遭遇威胁或已知密钥的安全级别不够高等情况的疑惑时,该密钥应被撤销并不能再使用。在密钥销毁过程中,应找到在存储区上的密钥副本,且删除它们,还需要删除全部临时文件或交换文件的内容。要粉碎写在纸上的密钥,需对在介质上的密钥进行反复冲写操作。