本文用于学习总结密码学基础知识。不是原创,我只是搬运工。主要参考文献:
https
密码学基础知识
一、概述
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
大约在公元前1900年(相当于古代中国的大禹时代),古埃及的一位石匠在主人的墓室石墙上刻下了一段象形文字,这段描述他的贵族主人一生事迹的文字,被西方密码专家认为是密码学的开端。
1949年,香农发表题为《保密系统的通信理论》的文章,发表在《贝尔实验室技术杂志》,为密码系统建立了理论基础,从此密码学成了一门科学。此前认为使用的密码体制为传统密码体制范畴。
1.1 要求
- 保密性:Confidentiality,仅有发送方和指定的接收方能够理解传输的报文内容。窃听者可以截取到加密了的报文,但不能还原出原来的信息,即不能得到报文内容。(加密解密技术)
- 完整性:Integrity,即使发送方和接收方可以互相鉴别对方,但他们还需要确保其通信的内容在传输过程中未被改变。(消息认证码,数字签名)
- 认证性: Authentication,发送方和接收方都应该能证实通信过程所涉及的另一方, 通信的另一方确实具有他们所声称的身份。即第三者不能冒充跟你通信的对方,能对对方的身份进行鉴别。(消息认证码,数字签名)
- 不可否认性:Non-repudiation,如果人们收到通信对方的报文后,还要证实报文确实来自所宣称的发送方,发送方也不能在发送报文以后否认自己发送过报文。(数字签名)
1.2 概念
密码学的英语单词是 Cryptograghy,是研究如何保护信息安全性的一门科学,组成分支分为编码学和密码分析学。
密码编码学主要研究对信息进行编码,实现信息的隐蔽。密码分析学主要研究加密消息的破译或消息的伪造。
明文:能直接代表原文含义的信息。用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,无论在哪种情况,M指待加密的消息。
密文:经过加密处理之后,隐藏原文含义的信息。用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。
加密算法:将明文转换成密文的实施过程。加密函数E作用于M得到C,用数学表示为E(M) = C.
解密算法:将密文转换成明文的实施过程。解密函数D作用于C产生M,用数学表示为D© = M。先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:D(E(M)=M。
密钥:控制加密或解密过程的可变参数,分为加密密钥和解密密钥。用K表示。
1.3 加密的基本原理
- 替代:substitution cipher,有系统地将一组字母换成其他字母或符号。例如‘help me’变成‘ifmq nf’(每个字母用下一个字母取代)。
- 置换:Transposition cipher,不改变字母,将字母顺序重新排列。例如‘help me’变成‘ehpl em’(两两调换位置)。
1.4 密码分析和攻击方法
分析方法:
- 穷举法也称为暴力攻击,密码分析者通过试遍所有的密钥来进行破译,显然可以通过增大密钥量来对抗穷举攻击。它是对截获的密文依次用各种可能的密钥试译,直到获得有意义的明文,或者利用对手已注入密钥的加密机,对所有可能的明文依次加密直到得出与截获的密文一致的密文。只要有足够的时间和存储空间,穷举攻击法原则上是可行的,但在实际中, 计算时间和存储空间都受到限制,只要密钥足够长,这种方法往往不可行。
- 数学分析法又分为确定性分析法和统计分析法。确定性分析法,又称解密变换攻击,是利用密文或者“明文—密文”对等已知量以数学关系式表示出所求未知量(如密钥等),然后计算出未知量。为对抗这种攻击,应该选用具有坚实的数学基础和足够复杂的加密算法。
- 统计分析方法,密码分析者通过分析密文和明文的统计规律来破译密码,是利用统计规律进行破译的方法,它是对截获的密文进行统计分析,找出其统计规律或特征,并与明文空间的统计特征进行对照比较,从中提取出密文与明文间的对应关系,最终确定密钥或明文。对抗统计分析攻击的方法是设法使明文的统计特性与密文的统计特性不一样 。
- 线性密码分析:作为一种己知明文攻击方法,线性密码分析方法叫的本质思想在于,通过将一个给定的密码算法有效且线性近似地表示出来以实现破译。现有密码分析技术也得到了一定的推广。利用己知明文,16轮DES系统己可以通过线性密码分析进行破译,在某些情况下甚至可以实现唯密文攻击。针对数据加密标准DES系统的主要攻击包括强力攻击手段,差分密码分析等。就16轮DES密码系统而言,不管是差分密码分析还是线性密码分析方法,需要用到的明文太多,因此效率比较低。为了提高攻击效率,可以结合差分密码分析和线性密码分析技术,即差分-线性密码分析技术。
- 差分密码分析:1990年,以色列密码学家Biham和Shamir提出了差分密码分析技术。差分密码分析特别适用于迭代密码。差分密码分析的本质思想在于,通过分析相应明文对差值和密文对差值之间的相互影响关系,来得到密钥的一些比特信息。对于差分密码分析也有很多推广,其中比较常见的包括高阶差分密码分析等。差分密码分析利用的是密码体制的高概率差分。
攻击方法:
- 唯密文攻击:在仅知已加密文字(即密文)的情况下进行穷举攻击。只知道密文。
- 已知明文攻击:知道一部分明文和其对应的密文,分析发现密钥。 已知明密文对。
- 选定明文攻击:设法让对手加密自己选定的一段明文,并获得对应的密文,在此基础上分析发现密钥。即知道选择的明文和加密的密文。
- 选择密文攻击:攻击者掌握对解密机的访问权限,可构造任意密文所对应的明文。
四种密码攻击方式中破解难易度由大到小。防范密码学攻击方式的难易程度由小到大。
1.5 密码的安全性
- 无条件安全:无论破译者的计算能力有多强,无论截获多少密文,都无法破译明文。也称信息论安全(Information-theoretic security)。1949年,Shannon[1]首次利用其创立的信息论对加密安全进行定义,证明了 “一次一密”加密方案是安全的。这种安全也称为无条件安全,对攻击者的计算能力做没有任何限制,导致“一次一密”等无条件安全的加密算法都存在一个 明显的缺点:加密所需的密钥长度不小于消息的长度。如何生成和管理这些海量的随机密钥,成为应用中棘手的问题。
- 计算上安全:破译的代价超出信息本身的价值,破译所需的时间超出信息的有效期。
- 可证明安全:1982年,Goldwasser和Micali两位学者[2],首次在计算意义下给出了加密安全性的定义,并且用归约(reduction)方法,证明了其构造方案的安全性。这一工作为现代密码学的研究奠定了理论基础。语义安全表示为攻击者即使已知某个消息的密文,也得不出该消息的任何部分信息,即使是1比特的信息。属于实际安全。
- 实际安全性
对于实际应用中的密码系统而言,由于至少存在一种破译方法,即强力攻击法,因此都不能满足无条件安全性,只提供计算安全性。密码系统要达到实际安全性,就要满足以下准则:
(1)破译该密码系统的实际计算量(包括计算时间或费用)十分巨大,以致于在实际上是无法实现的。
(2)破译该密码系统所需要的计算时间超过被加密信息有用的生命周期。例如,战争中发起战斗攻击的作战命令只需要在战斗打响前需要保密;重要新闻消息在公开报道前需要保密的时间往往也只有几个小时。
(3)破译该密码系统的费用超过被加密信息本身的价值。
如果一个密码系统能够满足以上准则之一,就可以认为是满足实际安全性的。
影响密码安全的主要因素:
- 扩散(Diffusion),即明文的统计结构被扩散消失到密文的长程统计特性。扩散的目的是让明文中的单个数字影响密文中的多个数字,从而使明文的统计特征在密文中消失,相当于明文的统计结构被扩散。
- 扰乱(confusion):使得密文的统计特性与密钥的取值之间的关系尽量复杂,从而增加通过统计方法进行攻击的难度。扰乱可以通过各种代换算法实现。
如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法;如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。
现代密码学用密钥解决了这个问题,所有这些算法的安全性都基于密钥的安全性。
任何密码系统的应用都需要在安全性和运行效率之间做出平衡,密码算法只要达到计算安全要求就具备了实用条件,并不需要实现理论上的绝对安全。1945年美国数学家克劳德·E·香农在其发布的《密码学的数学原理》中,严谨地证明了一次性密码本或者称为“弗纳姆密码”(Vernam)具有无条件安全性。但这种绝对安全的加密方式在实际操作中需要消耗大量资源,不具备大规模使用的可行性。事实上,当前得到广泛应用的密码系统都只具有计算安全性。
二、古典密码学
以时间划分,1976 年以前的密码算法都属于古典密码学,基本使用在军事机密和外交领域,它的特点就是加解密过程简单,一般用手工或机械就可以完成。
2.1 置换密码
又称换位密码,加密过程中明文的字母保持相同,但是顺序被打乱。只要把位置恢复,就能得到明文。
公元前 500 年的古希腊斯巴达邦城,存在一种叫做棍子加密(也叫“塞塔式密码”)的加密方法。找一个腰带,将信息横着写在腰带上,但是这个信息是完全打乱的,需要一个可以解密的棍子,将腰带缠绕在棍子上,就可以恢复出明文。这也是最简单的置换密码的方式。
分类:
-
列置换密码:将明文字符P以固定的分组宽度m按行写出,构成m x n的矩阵[M]mxn,不够的按双方约定的字符补充,比如空格字符。然后通过某一交换列的位置次序的到矩阵[Mp]mxn,最后输出举证[Mp]mxn,即得到密文。
-
周期置换密码:周期置换密码是将明文p串按固定长度m分组.然后对每组中的子串按1,2…,m的某个置换重新排列位置从而得到密文,其中密钥σ包含分组长度信息。解密时同样对密文c按长度m分组,并按σ的逆置换σ-1把每组子串重新排列位置从而得到明文p。
2.2 代换密码
明文中的每一个字符被替换成密文中的另一个字符。接收者对密文做反向替换就可以恢复明文。
乘法密码是简单代替密码的一种。它需要预先知道消息元素的个数,加密的过程其实是相当于对明文消息所组成的数组下标进行加密,然后用明文消息中加密后位置所对应的明文字符代替。
2.2.1 单表代换
- 凯撒密码
一种单表代换密码,加密方式就是通过对字母的位移进行加密,比如把字母表右移三位,上面是明文表,下面是对应的密文表。
- 仿射密码
单表加密的一种,字母系统中所有字母都藉一简单数学方程加密,对应至数值,或转回字母。仿射密码的加密算法是线性变换。
单表代换密码就很容易被破解,只要用频率分析表就可以破解(唯密文攻击),这是根据人类自然语言中,字母出现的频率不同来进行破解的。也相对应的出现防止破解的方法。
- 多名或同音代替密码:与简单代替密码类似,只是映射是一对多的,每个明文字母可以加密成多个密文字母。用已知明文攻击比较容易破解。
- 多字母代替密码:每次对 L 个字母进行代换,隐藏或均匀化字母的自然频度,用于抵抗频率分析。比如 hill密码,用已知明文攻击比较容易破解。
- 多表代替密码:多代替密码可以说是古典密码学的巅峰之作,是以一系列(两个以上)代换表依次对明文消息的字母进行代换的加密操作。先把明文分成多份,代换表有很多个,根据序列依次更换代换序列,对每个序列进行加密。下面几个例子都是多表替换密码。假设明文字符表为Zq,替换表序列为 L=L1L2L3…, 明文字符序列为 M=m1m2m3…,则相应的密文序列 C=L(M)=L1(m1)L2(m2)…。如果替换序列是非周期的无限序列,则相应的密码技术为非周期多表替换密码技术,对每个明文都采用了不同的替换表进行加密,理论上是不可破译的。在实际应用中,大多采用周期多表替换,使用有限的替换表,以完成对明文的加密。例如,周期是d,则替换表序列为 L=L1L2L3…LdL1L2L3…Ld…。
2.2.2 Playfair
1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明。
原理:是一种使用一个关键词方格来加密字符对的加密法,它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。
破译:它使用方便而且可以让频度分析法变成瞎子,在1854到1855年的克里米亚战争和1899年的布尔战争中有广泛应用。但在1915年的一战中被破译了。
2.2.3 vigenere
该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》。1856年由法国密码学家 Blaise de Vigenere发明。
原理:Vigenere密码使用一个字符串作为密钥,字符串中的每一个字符都作为移位替换密码的密钥并确定一个替换表(即确定了使用多表中的哪个表)。
设密钥K=k1k2…kd,明文与密文表中均包含n个字母,明文 M=m1m2…,密文 C=c1c2…
则加密 Ci=(mi+ki)mod n
解密 Mi=(ci - ki+n)%n
在通常的Vigenere密码中,替换表由26个英文字母组成,为周期循环。若看成一维表,由于共26个字母,每个字母可做一个i 指定一个替换表,即共26个替换表。即本总密文表长度为26X26
Vigenere密码的26个密码表,每个表相对前一个表发生一次左移。若看成二维表,则可能更容易对比。左侧的a-z为密钥,上方的为明文, 由此(i,j)确定下此环境时的相应密文。
破译:维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。
2.2.4 博福特密码
由弗朗西斯·蒲福(Francis Beaufort)发明。它最知名的应用是哈格林M-209密码机。博福特密码属于对等加密,即加密算法与解密算法相同。
原理:博福特密码是按mod q减法运算的一种周期代替密码,
2.2.5 Hill Cipher
希尔密码由Lester S. Hill于1929年在《American Mathematical Monthly》杂志上首次提出。
原理:是运用基本矩阵论原理的替换密码。基本思想是,将d个明文字母通过线性变换将它们转换为d个密文字母。每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。解密只要作一次逆变换就可以了,密钥就是变换矩阵本身。
特点:抵抗频率分析攻击能力最强,而对已知明文攻击最弱。
破译:希尔密码算法的缺点在于线性变换的安全性很脆弱,易被攻击击破。容易受到已知明文攻击,因为它是完全线性的代数,因此会受到密钥的攻击。
2.2.6 enigma 密码机
恩尼格玛是对二战时期纳粹德国使用的一系列相似的转子机械加解密机器的统称,它包括了许多不同的型号,为密码学对称加密算法的流加密。多表代换。
原理:使用“恩尼格玛”通讯时,发信人首先要调节三个转子的方向(而这个转子的初始方向就是密匙,是收发双方必须预先约定好的),然后依次键入明文,并把显示器上灯泡闪亮的字母依次记下来,最后把记录下的闪亮字母按照顺序用正常的电报方式发送出去。收信方收到电文后,只要也使用一台“恩尼格玛”,按照原来的约定,把转子的方向调整到和发信方相同的初始方向上,然后依次键入收到的密文,显示器上自动闪亮的字母就是明文了。加密和解密的过程完全一样,这就是反射器的作用,同时反射器的一个副作用就是一个字母永远也不会被加密成它自己,因为反射器中一个字母总是被连接到另一个不同的字母。
安全性分析:“恩尼格玛”有三个转子(二战后期德国海军使用的“恩尼格玛”甚至有四个转子!)。“恩尼格玛”密码机的三个转子是可以拆卸下来并互相交换位置,这样一来初始方向的可能性一下就增加了六倍。“恩尼格玛”还有一道保障安全的关卡,在键盘和第一个转子之间有块连接板。通过这块连接板可以用一根连线把某个字母和另一个字母连接起来,这样这个字母的信号在进入转子之前就会转变为另一个字母的信号。这种连线最多可以有六根(后期的“恩尼格玛”甚至达到十根连线),这样就可以使6对字母的信号两两互换,其他没有插上连线的字母则保持不变。——当然连接板上的连线状况也是收发双方预先约定好的。
三个转子不同的方向组成了26x26x26=17576种可能性;三个转子间不同的相对位置为6种可能性;连接板上两两交换6对字母的可能性则是异常庞大,有100,391,791,500种;于是一共有17576x6x100,391,791,500,大约为10,000,000,000,000,000!即一亿亿种可能性!
破译:1932年,波兰密码学家马里安·雷耶夫斯基、杰尔兹·罗佐基和亨里克·佐加尔斯基根据恩尼格玛机的原理破译了它。
2.3 古典密码学的特点
- 计算强度小
- 出现在 DES 之前
- 数据安全基于算法的保密。这和现代密码有很大的差距,只要知道加密方法,就能轻易的获取明文。现代的密码基于秘钥的加密,算法都是公开的,而且公开的密码算法安全性更高,能被更多人评论和使用,加强漏洞的修补。
- 以字母表为主要加密对象。古典密码大多数是对有意义的文字进行加密,而现代密码是对比特序列进行加密。这也是现代密码和古典密码的区别,而且古典密码的分析方法也是用字母频率分析表来破解的。
- 替换和置换技术
- 密码分析方法基于字母与字母组合的频率特性以及明文的可读性
- 分析方法:统计分析法、明文-密文分析法、穷举分析法、重合指数法
三、对称密码学(私钥密码)
原理:其加密密钥和解密密钥相同,或实质上等同,即从一个易于推出另一个。它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的加密和解密表示为 EK(M)=C,DK©=M。
优点:保密性高,加密速度快,适合加密大量数据,易于通过硬件实现。
缺点:秘钥必须通过安全可靠的途径传输,秘钥的分发是保证安全的关键因素。
分类:一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。
现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。
3.1 序列密码(流密码)
原理:Stream Cipher,序列密码是一个随时间变化的加密变换。每次加密一位或一字节的明文,通过伪随机数发生器产生性能优良的伪随机序列(密钥流),用该序列加密明文消息序列,得到密文序列,解密过程也一样。序列密码的安全性能主要取决于密钥流或者密钥流产生器的特性。
优点:转换速度快、低错误传播,硬件实现电路更简单;
缺点:低扩散(意味着混乱不够)、插入及修改的不敏感性。密钥长度与明文长度一致,如果需要加密20M的明文,那么就需要20M的密文。序列密码容易被篡改。如果密钥流发生器每次都生成同样的密钥流的话,就很容易被破译。
分类:
- 输出反馈模式:output feedback,OFB,密码算法的输出会反馈到密码算法的输入中。在CFB中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此有“密文反馈模式“这个名字。 而在OFB中,密码算法的输入则是密码算法的前一个输出,也就是将输出反馈给密码算法,因此也有“输出反馈模式”这个名字。
- 计数器模式:counTeR,CTR,是一种通过将逐次累加的计数器进行加密来生成密钥流的流密钥。在CTR中,每个分组(明文分组或者密文分组)都对应一个计数器,并通过计数器来生成密钥流。最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR运算。
1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试,或者说“一次一密”的密码方案是序列密码的雏形。**如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。**序列密码涉及到大量的理论知识,提出了众多的设计原理,也得到了广泛的分析,但许多研究成果并没有完全公开,这也许是因为序列密码目前主要应用于军事和外交等机密部门的缘故。
示例:
它的加密方式是将明文和密钥进行异或运算,如:明文a,ASCLL码为97,二进制码为0110 0001;密钥为B,ASCLL码为66,二进制码为0100 0010,然后再按位异或:
这样得到的密文为0010 0011,对应的ascll为35,即“#”。
当我们拿到密文“#”以及密钥“B”以后,我们同样按照转换为ASCLL码,按位异或的方式,获得明文:
这样,我们获得了“0110 0001”,转换为十进制为97,对应ASCLL表,得到了字符“a”。
明文、密文和密钥序列都是由单独的位组成,即Xi,Yi,Si ∈{0,1}
加密:Yi = (Xi + Si) mod 2
解密:Xi = (Yi + Si) mod 2
3.1.1 同步序列密码
原理:种子密钥k经过由安全信道传送给收、发双方后,由密钥流产生器生成加密和解密所需要的密钥流,而加、解密本身就是简单的模2加法运算。
特点:
- 密钥流仅仅依赖于种子密钥和密钥流产生器的结构,而与明文流(或密文流)无关。
- 如果密钥流完全随机产生且长度至少和明文流一样长,则可实现绝对安全的“一次一密”。但实际上,这很难做到。
- 无差错传播。因为密钥流独立于密文流,所以一个密文的传输错误不会影响下一个密文的解密。
- 为了保障接收端能够正确解密,要求收、发双方必须严格同步。一旦接收端和发送端的种子密钥和内部状态不同步,解密就会失败,两者必须立即借助外界手段重新建立同步。(所以在大规模民用上比较困难。
3.1.2 自同步序列码
原理:与同步序列密码需要收、发双方严格同步不同,自同步序列密码能够依靠自身的能力“自动地”实现收、发双方的同步,因而是一种不需要外部同步的序列密码系统
特点:
- 密钥流不仅依赖于种子密钥和密钥流产生器的结构,还与密文流(或明文流)有关。初始向量IV在这里相当于初始密文的作用,要求收、发双方必须相同。
- 自同步。解密只取决于先前特定数量的密文字符,因此,即使出现删除、插入等非法攻击,收方最终都能够自动重建同步解密,因而收、发双方不再需要外部同步。
- 有差错传播。因为密钥流与密文流有关,所以一个密文的传输错误会影响下面有限个密文的解密。
3.2 分组密码
原理:分组密码使用的是一个不随时间变化的固定变换。将明文分为固定长度的组,用同一秘钥和算法对每一块加密,输出也是固定长度的密文,解密过程也一样。对于当前的许多分组密码,分组大小是 64 位,但这很可能会增加。
优点:扩散性好、插入敏感,不需要密钥同步,较强的适用性,适合作为加密标准。
缺点:加解密处理速度慢、存在错误传播。
分类:
-
电子编码本:Electronic Code Book,ECB, 一个明文分组加密成一个密文分组;可以使某些攻击更难以实施。 最大的缺点是同样的明文块会被加密成相同的密文块,不能很好地保证数据的机密性。
-
密码分组链接:Cipher-block chaining,CBC,每个明文块先与前一个密文块进行异或后,再进行加密。 为了保证每条消息的唯一性,在第一个块中需要使用初始化向量(IV)。CBC 受到广泛使用,例如在 DES(qv)实现中,而且在有关密码术的技术性方面的相应书籍中深入讨论了各种方式。主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。在加密时,明文中的微小改变会导致其后的全部密文块发生改变。而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。解密过程可以被并行化。
-
密码反馈:Ciphertext feedback,CFB,前一个密文分组会被送回到密码算法的加密端,加密后与明文异或得到密文。第一个密文分组,不存在前一个输出的数据,所以需要初始向量化(IV)来代替。CFB的解密算法中依然执行的是加密操作,因为密钥流是通过加密操作实现的。
3.2.1 DES
定义:Data Encryption Standard,即数据加密标准。1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
原理:入口参数有三个Key、Data、Mode。其中Key为7个字节共56位(64位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)),是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
步骤:
- 初始置换:其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。
- IP置换:IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
- 密钥置换:在DES的每一轮中,从56位密钥产生出不同的48位子密钥,这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。
- E扩展置换:目标是IP置换后获得的右半部分R0,将32位输入扩展为48位(分为4位×8组)输出。生成与密钥相同长度的数据以进行异或运算;提供更长的结果,在后续的替代运算中可以进行压缩。
- S盒代替:压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送人S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。
- P盒置换:S盒代替运算的32位输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去。
- IP-1末置换:末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。
- 逆置换:经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
攻击方法:在已经知道明文和对应密文的情况下,通过穷举和暴力破解是可以破解DES的。对DES的三种主要攻击方法包括强力攻击、差分密码分析、线性密码分析。
3.2.2 3DES
定义:Triple DES,是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。
原理:使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
3DES加密过程为:C=Ek3(Dk2(Ek1§))
3DES解密过程为:P=Dk1(EK2(Dk3©))
优点:
- 两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。
- 加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。
- 三重DES具有足够的安全性,还没有关于攻破3DES的报道。
3.2.3 IDEA
定义:是上海交通大学教授来学嘉与瑞士学者James Massey联合提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到DES具有密钥太短等缺点。IDEA使用长度为128bit的密钥,数据块大小为64bit。IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。
算法:它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。
密钥扩展:在加密之前,IDEA通过密钥扩展(Key Expansion)将128bit的密钥扩展为52个加密密钥EK(Encryption Key),然后由EK计算出解密密钥DK(Decryption Key)。EK和DK分为8组半密钥,每组长度为6Byte,前8组密钥用于8圈加密,最后半组密钥(4Byte)用于输出变换。IDEA的加密过程和解密过程是一样的,只不过使用不同的密钥(加密时用EK,解密时用DK)。
- 将128bit的密钥作为EK的最初八个子密钥;
- 将前8byte循环左移25bit,得到下一六个子密钥,将这个过程循环7次;
- 在第7次循环时,取前4byte作为EK的最后4bit;
- 至此52byte的EK生成完毕。
3.2.4 AES
定义:Advanced Encryption Standard,高级加密标准。用来替代原先的DES,已经被多方分析且广为全世界所使用。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,因此又称Rijndael加密法。由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。(严格地说,AES和Rijndael加密法并不完全一样,虽然在实际应用中二者可以互换,因为AES的区块长度固定为128位,密钥长度则可以是128,192或256位;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256位为上限。)
原理:使用的是置换-组合架构,在软件及硬件上都能快速地加解密,相对来说较易于实现,且只需要很少的存储器。AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。
步骤:加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤。
-
AddRoundKey:—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;在每次的加密循环中,都会由主密钥产生一把回合密钥(通过Rijndael密钥生成方案产生),该密钥大小会跟原矩阵一样。
-
SubBytes:矩阵中的各字节通过一个8位的S-box进行转换。这个步骤提供了加密法非线性的变换能力。 为了避免简单代数性质的攻击,S-box结合了乘法反元素及一个可逆的仿射变换矩阵建构而成。此外在建构S-box时,刻意避开了固定点与反固定点,即以S-box替换字节的结果会相当于错排的结果。
-
ShiftRows:将矩阵中的每个横列进行循环式移位。Rijndael算法的版本中,对于长度256比特的区块,第一行仍然维持不变,第二行、第三行、第四行的偏移量分别是1字节、3字节、4位组。AES偏移量是1、2、3。
-
MixColumns:为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。
攻击方法:旁路攻击(又称旁道攻击、侧信道攻击)。旁道攻击不攻击密码本身,而是攻击那些实现于不安全系统(会在不经意间泄漏信息)上的加密系统。2005年4月,D.J. Bernstein公布了一种缓存时序攻击法,他以此破解了一个装载OpenSSL AES加密系统的客户服务器。为了设计使该服务器公布所有的时序信息,攻击算法使用了2亿多条筛选过的明码。
2005年10月,Eran Tromer和另外两个研究员发表了一篇论文,展示了数种针对AES的缓存时序攻击法[8]。
四、非对称密码(公钥密码)
定义:其加密密钥和解密密钥不同,两个密钥在数学上相关,从一个很难推出另一个。其中的加密密钥可以公开,称为公开密钥,简称公钥(public key);解密密钥必须保密,称为私有密钥,简称私钥(private key)。
优点:密钥交换可通过公开信道进行,无需保密,既可用于加密也可用于签名。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得 十分简单。非对称密码体制不但赋予了通信的保密性,还提供了消息的认证性,无需实现交换秘钥就可通过不安全信道安全地传递信息,简化了密钥管理的工作量,适应了通信网的需要,为保密学技术应用于商业领域开辟了广阔的前景。
缺点:加密速度不如对称密码,不适合大量数据加密,加密操作难以通过硬件实现。
起源:DH 密钥交换协议是在 1976 年 Diffie 和 Hellman 提出的《密码学新方向》中提出的协议,它主要解决的是密钥分发问题,是公钥密码学的开端,它的安全性是基于计算 Diffie-Hellman 问题的难解性。数学基础是费马小定理。
原理:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方;乙方再用甲方的公钥对甲方发送回来的数据进行验签。甲方只能用其私钥解密由其公钥加密后的任何信息。
分类:根据其所依据的难题一般分为,大素数分解问题类(IFP)、离散对数问题类(ECDLP)、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
非对称密码比对称密码更安全?任何一种算法的安全都依赖于秘钥的长度、破译密码的工作量,从抗分析的角度看,没有哪一方更优越。
非对称密码使对称密码成为过时技术?公钥算法很慢,一般用于密钥管理和数字签名,对称密码将长期存在,实际工程中采用对称密码与非对称密码相结合。
4.1 RSA
起源:RSA 算法是第一个公钥密码算法,也是第一个数字签名算法。它被提出的时间最早,关于它的研究最为广泛,因此也是理论上最成熟的密码学算法。在1977年被麻省理工学院的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)三位科学家提出,由于难于破解,RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。
原理:它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等。具有乘法同态性,也可以称为第一个乘法同态特性的算法。
- 算法的核心是欧拉定理。a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。费马小定理是欧拉定理的特例。
- 模反元素:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。这时,b就叫做a的"模反元素"。欧拉定理可以用来证明模反元素必然存在。
密钥生成与加解密步骤:
- 随机选择两个不相等的质数p和q(实际应用中,这两个质数越大,就越难破解);关于 RSA 算法参数 p,q 的选择,要求p和q 要足够大的素数、p 和 q 要为强素数、(p-1)和(q-1)的最大公因子要小。
- 计算p和q的乘积n,n的长度就是密钥长度;
- 计算n的欧拉函数φ(n) = (p-1)(q-1);
- 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质;
- 计算e对于φ(n)的模反元素d;
- 将n和e封装成公钥,n和d封装成私钥(实际应用中,公钥和私钥的数据都采用ASN.1格式表达)。
- 加密:me ≡ c (mod n)。m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。如果要加密大于n的整数,有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。
- 解密:cd ≡ m (mod n)
破解:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。目前被破解的最长RSA密钥是768个二进制位。RSA在选择密码攻击面前显得很脆弱。
演进:
- Rabin密码体制是RSA密码体制的一种,假定模数n=pq不能被分解,该类体制对于选择明文攻击是计算安全的。因此,Rabin密码体制提供了一个可证明安全的密码体制的例子:假定分解整数问题是整数上不可行的,那么Rabin密码体制是安全的。Rabin加密算法的效率非常高,因为仅需一次mod平方运算,但是缺点是接收者需要从四种可能的情况下选择一个正确的明文,这种不确定问题可以通过预先增加定义原始明文消息冗余来解决。
- Williams针对Rabin方案解密不唯一情况进行改进。
4.2 ECC
定义:Elliptic curve cryptography,椭圆曲线密码学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。ECC被公认为在给定密钥长度下最安全的加密算法。比特币中的公私钥生成以及签名算法ECDSA都是基于ECC的。
优点:在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全(有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同);可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。在私钥的加密解密速度上,ecc算法比RSA、DSA速度更快。存储空间占用小。带宽要求低。
缺点:加密和解密操作的实现比其他机制花费的时间长。
原理:椭圆曲线上的点P和Q。过P和Q做一条直线,交椭圆曲线为点R’,再过R’点做垂直于X轴的直线,交曲线另一点为R,定义P + Q = R。若P=Q,则为过P点的切线交于椭圆曲线为R’。类似的3P=P+P+P=P+2P=P+R。也就是说,当给定基点G时,“已知数x求点xG的运算”不难,因为有加法的性质,运算起来可以比较快。但反过来,“已知点xG求x的问题”则非常困难,因为只能遍历每一个x做运算。这就是椭圆曲线密码中所利用的“椭圆曲线上的离散对数问题”。给定椭圆曲线E,基点G和点xG,我们称xG为公钥,x值为私钥。
破解:目前由椭圆曲线公钥求解私钥的最有效算法复杂度为O(根号p),其中p是阶数n的最大素因子。
4.3 Merkle-Hellman背包公钥加密体制
1977年,Merkle与Hellman合作设计了使用背包算法,该算法提出后密码学界提出了很多背包型加密算法。是目前国际公认的较理想公钥密码体制,是目前网络上进行保密通信和数字签名的较为有效的算法。
原理:假定甲想加密,则先产生一个较易求解的背包问题,并用它的解作为专用密钥;然后从这个问题出发,生成另一个难解的背包问题,并作为公共密钥。如果乙想向甲发送报文,乙就可以使用难解的背包问题对报文进行加密,由于这个问题十分难解,所以一般没有人能够破译密文;甲收到密文后,可以使用易解的专用密钥解密。背包加密分为加法背包和乘法背包。
破译:1982年就找到了攻破它的方法。利用孤立点破解;利用背包破解。
4.4 ELGamal密码体制
它在1985年由塔希尔·盖莫尔提出.
原理:基于Diffie-Hellman迪菲-赫尔曼密钥交换的非对称加密算法。既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。它所根据的原理是:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。在使用EIGamal加密算法时,模运算是实现公钥密码加解密运算速度的关键。
安全性分析:ElGamal加密体制具有选择明文攻击下的不可区分性(IND-CPA),当且仅当计算Diffie-Hellman问题是困难的
4.5 McEliece 公钥密码体制
于1978年提出,Robert J.McEliece是美国加州理工大学院电子工程系的知名教授。
原理:使用了一系列纠错代码Goppa,安全性基于纠错码问题(安全性基于一般译码问题的NP困难性)。是一种基于一个二进制线性码寻找最近码字的困难性的密码体制。
特点:安全性强,但计算效率低。
破解:随着量子计算机发展,该密钥体制可以被破解(2008年某学者提出相应的算法)。
4.6 NTRU
Number Theory Research Unit。1996年由美国布朗大学三位数学教授学家Jeffrey Hoffstein,Jill Pipher,和Joseph H. Silverman发明的公开秘密体制。NTRU成为当前公钥体制研究的一个热点。NTRU是一个带有专利保护的开源公开密钥加密系统.
原理:它的安全性依赖于格中最短向量问题(SVP)。使用基于格的加密算法来加密数据。它包括两部分算法,NTRUEncrypt用来加密,NTRUSign用来进行数字签名。与其他流行的公钥加密系统不同,它可以防止被Shor算法破解,并显著提升了性能。NTRU算法具有抵抗量子计算攻击的能力,而RSA和ECC算法是无法抵抗量子计算的。
优点:在同等加密强度下,NTRU执行大开销的私钥操作比RSA算法快得多。RSA算法的私钥操作耗时与密钥长度呈三次方关系,而NTRU相应操作为二次方关系。抗量子计算攻击。
4.7 格密码
第一个基于格的密码体制是 1997 年提出的 Ajtai-Dwork 密码体制. 该体制的安全性基于 Ajtai的average-case 到 worst-case 的归约 .
2005年–2016年,第二代格密码出现并逐步完善,并实用化格密码算法 (Regev05, GPV08,MP12 BLISS ,NewHope, Frodo)。
2016年以后,格密码逐步得以标准化。
优点:格密码是一类备受关注的抗量子计算攻击的公钥密码体制。
最近向量问题是格上的困难问题