对称加密算法原理简介
对称加密算法原理简介
对称加密算法使用相同的**进行加密和解密,它的计算量小,速度快,是最常用的加密方式,也是密码学和各种安全技术应用的基础。本文主要介绍对称加密算法的基本概念、设计思想和原理。
为什么学习密码学
我原来对加密算法的了解仅限于基本的使用,对密码学更没什么认识,也没有什么兴趣,觉得无非就是加密、解密,或者是公钥加密、私钥解密、私钥签名、公钥校验,还有哈希和其它一些派生算法等等。不过学习区块链之后,我才发现密码学的内容很丰富,也很有意思,有很多花样可以玩。
区块链
区块链是重度依赖密码学的技术,虽然主要使用公钥算法,但衍生出的技术和应用很多,例如比特币的基于哈希碰撞的工作量证明,基于脚本的转账方式,以太坊的智能合约,门罗币的环签名,Zcash的零知识证明和IPFS里的各种存储证明等。未来区块链的应用落地也依赖于密码学技术的创新和突破。
信息安全
信息安全不只是重要,而且是越来越重要。从社会发展趋势来说,我们的生活逐步数字化、电子化、网络化、自动化、智能化,越来越多的个人数据在网上传输和存储,人们对数据和隐私的泄露也越来越担心,信息安全也会更加受到重视。
技术的发展也反映了这种趋势。早期的TCP/IP协议是明文传输的,但后来逐渐增加了各种安全机制,例如https已经在逐步取代http,还有像google的QUIC传输协议就直接内嵌了TLS。新的应用也更倾向于采用加密通信方式,例如比特币的协议是明文的,而新的ipfs、libra都直接使用加密协议传输。
数学
最近两年我开始系统学习数学,这也让我对算法的底层原理有了兴趣,不再只是把加密算法当成一个黑盒,而是想了解它们内部的实现机制和设计思想。而且数学理论比较抽象,难以理解,密码学作为数学的一种应用,正好可以当成理论学习的切入点。这样,理论和应用相结合,学习效果上可以相互强化。
古典密码
在现代密码学理论出现之前,加密主要依靠一些编码方面的技巧,没有系统化的理论基础和方法体系,所以加密操作比较简单。一般既需要保护**,也需要保护密码算法。具体来说是通过对明文进行各种变换处理,达到混淆和加密的效果。虽然古典密码有一定的限制,但它的基本操作仍然是现代密码的核心组成部分。
古典密码可以简单分为置换和替代两类,具体包括以下几种
移位密码(Shift Cipher)
又称凯撒算法,是历史上最早使用的密码之一,据说是凯撒发明并用来传递军令的。移位密码非常简单,就是对明文做相同的偏移并取模,即E(x)=x+b(mod m)。所以移位密码的**空间很小,一般用暴力**方式就可以找到**。
由于移位密码过于简单,现实中很少使用。行李箱上的密码锁用的可以算作是移位密码,虽然它的**是3位数,但只要找到转轮上的缺口,调整转轮让3个缺口对准相同的方向,密码就是当前读数的某个偏移,每次把3个数字都同时调整1位,最多只要尝试10次就能找到密码。
移位密码示例:
选择**k,0<k<26
k=23
E(x)=x+23(mod 26)
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: XYZABCDEFGHIJKLMNOPQRSTUVW
Plaintext: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
Ciphertext: QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD
仿射密码(Affine Cipher)
可以认为是移位密码的改进版,加密函数变成E(x)=ax+b(mod m),多了一个参数,**空间虽略有提升,但还是容易被**。
置换密码(Permutation Cipher)
通过对明文进行置换操作(重新排序)来达到加密的目的。不过由于密文和明文位于相同的空间,所以不太适合单独使用,但可以作为加密算法的中间步骤用来强化加密效果。
简单置换密码的示例:
明文为:Hello everyone!
密文为:Hoene reley!lvo
列置换密码示例:
6 3 2 4 1 5
W E A R E D
I S C O V E
R E D F L E
E A T O N C
E Q K J E U
从上面的表中,按照列的序号逐列输出,就得到列置换的编码:
EVLNE ACDTK ESEAQ ROFOJ DEECU WIREE
替代密码(Substitution Cipher)
预先建立好一张替换表,然后通过查表,将明文逐一替换为相应的密文,从而实现加密的目的,而这张替换表就是**。
按照使用的替换表的数量,替代密码可以分为单表替代密码和多表替代密码。单张替换表会使得明文和明文有相同的分布规律,因此容易被**。使用多张替换表可以隐藏这种规律,使得**密码更加困难。Vigenere密码和Hill密码等都是多表替代密码。
替代密码的灵活度比较高,广义的说,前面的几种密码都可以归为(单表)替代密码。虽然替代密码中明文和密文的对应关系导致它容易被**,但由于其非线性的特点,一般被用来实现现代加密算法中最核心的S-Box。非线性是指密文不是明文和**的简单线性组合,而是*度更高的进行变换。这种特性对于抵抗密码分析非常重要。
替换表:
明文字母表: ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表: ZEBRASCDFGHIJKLMNOPQTUVWXY
明文消息: flee at once. we are discovered!
密文消息: SIAA ZQ LKBA. VA ZOA RFPBLUAOAR!
流密码(Stream Cipher)
在前面的密码中,每个明文字符都是用的相同的**来进行加密。实际应用时我们会使用相同的**对一组固定大小的连续明文进行加密,这就是分组密码。
流密码是根据**产生一个**流,然后跟明文进行一对一的异或运算,达到加密的效果。由于明文只是跟**流进行简单的异或运算,所以加密强度完全取决于**流的随机性。
曾经被用的比较多的RC4就是一种流密码,在Wi-Fi Protected Access(WPA)中使用,后来被发现有漏洞,WPA被使用AES的WPA2代替。现在使用较多的流密码是ChaCha20,是Libra里用到的noise protocol framework的默认加密方式,也是WireGuard VPN使用的加密算法。
密码分析
密码分析专门研究**信息系统漏洞、获取秘密信息的方法,简单的说,就是研究如何**加密算法和**。下面先简单介绍一下相关的基本术语。
攻击模型
按照攻击者所拥有信息的差别,密码分析可以分为以下几种类别:
唯密文攻击(Ciphertext Only Attack)
攻击者只能获取到一些密文,通过分析密文的规律,进而推测加密算法和**的规律。这是最常见的情况,也是攻击难度最高的情况。
已知明文攻击(Known Plaintext Attack)
攻击者能截获到部分明文和使用相同**加密得到的密文。这种情况下,攻击者可以根据明文和密文之间的联系,来分析算法和**的可能性。
选择明文攻击(Chosen Plaintext Attack)
攻击者能够选择或构造特定的明文,并获取相应的密文,也就是说攻击者能访问加密机。这种情况下,攻击者可以更方便的操纵和分析加密过程,也就更容易**算法或**。
即使攻击者不能直接访问加密机,如果攻击者能够收集足够多的明文和明文对,并从中筛选出符合要求的明文,也能达到选择明文攻击的效果。
选择密文攻击(Chosen Ciphertext Attack)
攻击者能够选择或构造特定的密文,并获取相应的明文,也就是说攻击者能访问解密机。这种情况下,攻击者还可以操纵和分析解密过程,以视图获取解***。
传统密码分析
暴力**
**密码的最原始方法是暴力**,也就是尝试所有可能的**。不过这种方式效率很低,只适合**空间很小的情况,例如前面讲到的移位密码和仿射密码。
频率分析
对一般的密码,需要分析密文的规律和明文跟密文的关联。这时可以用频率分析之类的统计分析方法。例如,在简单的置换密码和替代密码中,明文字符和密文字符是一一对应的,所以明文的分布规律(英文里不同字母和字母组合出现的概率是不一样的)也会传导给密文,只要分析密文的分布规律,就可以反推得到明文,从而**密码。
英文字母频率:
E .127
T .091
A .082
O .075
I .070
N .067
S .063
H .061
R .060
...
最常见的两字母组合:
TH,HE,IN,ER,AN,RE,ED,ON,ES,ST,
EN,AT,TO,NT,HA,ND,OU,EA,NG,AS,
OR,TI,IS,ET,IT,AR,TE,SE,HI,OF.
最常见的三字母组合:
THE, ING, AND, HER, ERE, ENT,
THA, NTH, WAS, ETH, FOR, DTH.
频率分析的过程一般是这样,先找到频率最高的密文字母,如果它的频率显著高于其他字母,就可以假定它对应的明文字母是E,然后继续分析剩余字母。对不确定的情况,可以结合两个或三个字母的组合的频率来进行分析。
信息论
对于更复杂的密码,需要对明文和密文的规律做更深入的分析,这就需要更强有力的分析工具,信息论和香农(第一)定理开始派上用场了。信息论的核心是把不确定性作为度量信息的基础,使得“信息”这个原本比较抽象的概念变成可以定量分析的因素。通过分析加密过程中信息量的变化,我们可以在更本质的层次上去理解加密算法所做的各种变换,从而对密码分析和算法设计提供思想和方法上的指导。
现代分析方法
用信息论的话来说,只要密文有任何的规律,就相当于存在一些信息没有被隐藏好,留下了**的入口。要想提高**的难度,就需要尽可能的隐藏信息,减少密文的规律,也就是提高密文的随机程度。所以,好的加密算法需要在满足其它条件的前提下,使密文尽可能显得随机。而密码分析就是要从看上去随机的密文中寻找不够随机的规律和因素,现代分析方法更多的是使用相应的数学工具来分析密文分布的偏差。
在算法层面上最重要的有两种:差分分析和线性分析。
差分分析(Differential Cryptanalysis)
Differential在数学里是指微分,在这里一般翻译成"差分",不过意思都差不多,是指对明文做小的变化(用XOR来衡量),然后分析密文变化和明文变化的关联规律,从而计算**每一位的概率分布,逐步缩小范围,直到最终找到**。例如,如果明文中的一个字节发生变化,只会影响到密文的一个字节,那就能用频率分析来**密码。
差分分析属于选择明文攻击,但如果能收集充分多的明文,可以从中选择满足差分分析要求的明文,这时也适用于已知明文攻击。
差分分析是上世纪80年代提出的,论文作者发现DES算法能够有效抵抗差分分析,而算法经过细微调整后就容易分析得多,说明DES算法在设计时很可能就已经考虑到差分分析。后来IBM公司原DES团队的成员发表论文称IBM早在1974就发现了差分分析,抵抗差分分析也是DES的设计目标之一,不过美国*为了保持密码分析方面的技术优势,要求IBM对外保密,所以一直没有公开。
线性分析(Linear Cryptanalysis)
线性分析的原理跟线性回归有点像。线性回归是利用统计方法从一堆数据找出两个或多个变量可能存在的线性关系,对两个变量的情况来说,就是用一条平面上的直线去拟合给定的数据集,找到拟合度最理想的线性系数。线性分析则是根据加密算法的实现,选择中间一些步骤的输入位和输出位来定义一个随机变量,然后从收集到的明文和密文数据中来分析这个随机变量的分布,看是否存在统计学意义上的偏差。存在偏差,则说明算法在某些步骤上存在线性因素,从中就可以逐步推测**的各个位的值。
另一方面,线性分析跟差分分析本质上差不多,只是分别从宏观和微观的角度入手去解决问题。
对密码设计的影响
从前面差分分析和DES算法的关联可以看出,密码分析跟密码设计就是矛和盾、一体两面的关系。密码分析会针对密码设计中的特点,而密码设计也必须考虑到已知的密码分析方法。例如DES在设计时就考虑到了要抵抗住差分分析。简单的说,新设计的密码算法,必须至少能抵抗足够强度的差分分析和线性分析。
现代加密算法
基本设计思想:混淆(Confusion)、扩散(Diffusion)、随机
从前面的各种密码分析方法可以看出,要想抵抗住分析,从宏观上,密文必须体现出随机性,从微观上,明文的一处微小的局部变化必须体现为密文的全局变化,否则明文和密文就存在一对一的线性关系,容易被**。也就是说,要把明文打散混淆,不仅屏蔽密文跟明文的关联,还要将变化尽可能扩散。扩散的结果就是达到高耦合的目的,打破加密算法中的线性关系。
所以,加密算法的设计思想跟软件开发的原则正好相反。软件开发强调模块化,模块之间低耦合,模块内部高内聚,模块和代码结构清晰。而加密则是要把各个部分混为一体,使它们高度耦合,牵一发而动全身,让**者找不到线索。
流密码则是通过生成随机**流的方式来达到同样的目的。
柯克霍夫原则(Kerckhoffs’s Principle)
就算被所有人知道系统的运作步骤,密码系统应该仍然是安全的。
简单的说,就是加密算法应该公开,让大家充分的去研究和分析。如果全世界的密码学专家花了很长时间都找不到漏洞,那么这个算法基本上可以被认为是安全的。
这个规则是从实践经验中总结出来的。由于对称加密算法的安全性并不能用数学的方式证明,只能看实际应用中是否能抵抗各种分析和**,所以对算法保密虽然可以提高**的难度,但也降低了算法漏洞的透明度,导致漏洞被发现和利用后自己还不知道,后果更严重。
现在不只是算法会公开,而且基本上已经形成了公开选拔密码算法的机制,例如AES/RSA/SHA-3。未来的抗量子计算的加密算法也正在进行公开选拔。
SPN(Substitution-Permutation-Network)
SPN是一种特殊的迭代密码。迭代密码是通过多轮的迭代加密操作来提高混淆和扩散的程度,从而提高加密的强度。SPN中每一轮迭代操作都包括多个Substituion操作(S-Box)和一次Permutation操作(P-Box)。S-Box主要负责实现数据的混淆,它的非线性特性是加密算法的关键,是抵抗线性分析等方法的核心要素。P-Box主要负责变化的扩散,将局部的变化扩散到整个分组,提高抵抗**的能力。每一轮迭代使用不同的轮**,轮**都是从加密操作的主**衍生得到的。
DES
DES算法是IBM设计的,然后被美国*选为标准加密算法。它采用的是一种叫做Feistel的迭代分组密码结构,特点是每一轮的迭代操作是相同的,都是将数据块按位重新组合,然后分为左右两部分,计算后将左右两部分交换,作为下一轮计算的输入。
DES的缺点是**较短,只有56位,抵抗**的能力较弱,因此有了3DES,可以使用更长的**。不过3DES的计算量较大,效率较低。而且在**长度、迭代次数等方面难以扩展,所以有了AES。
AES
AES是美国国家标准与技术研究院(NIST)通过公开选拔挑选出作为国家标准的加密算法。AES的优点有:
- 足够安全,能很好的抵抗差分分析和线性分析
- 运算速度快,易于实现,而且适合用硬件电路实现
- 对内存要求低
- 密码长度和迭代次数可以扩展
加密模式
加密模式在分组加密中用来对每个分组的数据进行调整,包括填充以提高数据整体的安全性,常用的模式有以下一些:
Electronic Codebook Mode(ECB)
ECB是最简单和最基本的模式,对每个分组使用相同的方式加密,相同的明文数据块会被加密成相同的密文,降低了**的难度,所以实际应用中很少使用。
Cipher Block Chaining Mode(CBC)
CBC模式中,每个数据块加密时直接使用明文跟上个数据块加密后产生的密文或初始向量进行异或,再与**进行加密,得到密文。它的缺点是不利于并行、传递误差、需要初始化向量。
Output Feedback Mode(OFB)
每个数据块加密过程中的中间输出会反馈到下个数据块的加密过程中。缺点跟CBC类似。
Cipher Feedback Mode(CFB)
每个数据块加密产生的密文会反馈到下个数据块的加密过程中。缺点跟CBC类似。
Counter Mode(CTR)
用**对输入的计数器加密,然后跟明文异或得到密文。优点是可以并行,避免误差传递问题。缺点是可以针对单个数据块进行攻击。
Counter with CBC-MAC Mode(CCM)
CCM是在CBC和CTR的基础上增加CMAC算法校验,主要是通过MAC校验来解决CTR容易被攻击的问题。
Galois/Counter Mode(GCM)
GCM是在CCM的基础上改用GMAC算法代替CMAC算法,增加了并行化设计,可以提高加密性能,降低时延。
小结
虽然加密模式有很多种,但现在有实用价值的还是CCM和GCM两种。这两种也是TLS 1.3唯二使用的AES加密算法。
总结
对称加密算法的细节很多,这里难以逐一深入讲解,只能介绍一些基础的知识点。感兴趣的同学可以阅读相关的密码学书籍和网上的专题文章。
上一篇: C#中如何创建文件夹
下一篇: Spring Boot 配置加载顺序