”密码学“是一个高度跨学科的领域,包含纯数学、计算机科学以及电子工程等多方面的知识。 "许多小白看到这里应该头就大了"要学这么多知识才能理解密码学吗?"当然不需要"如果你的理想是成为密码学科学的研究者或者领域专家,一定要掌握上述学科知识。但是对于一名"初学者黑客"我们仅需要了解密码学的常规术语、密码加密、密码分析等密码学基本体系就足够了。
接下来我就以本篇文章给想了解密码学的小伙伴们一点启发和引导!
一、 什么是密码学
官方定义:密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
通俗理解:密码学是隐藏信息的科学和艺术,因此它们是保密的,然后"取消隐藏"它们,以便只有预期的接收者才能阅读它们。基本上,我们可以说密码学是秘密消息传递的科学。
二、 密码学里的常用术语解释
消息也成为明文。
加密的消息称为密文。
E(M) = C,E为加密函数,M为明文,C为密文。
D(C) =M,D为解密函数,C为密文,M为明文 。
算法和密钥:如果算法的保密性是基于保持算法的秘密,这叫受限制的算法。任何算法都是可能被人逆向分析的,显然这样是不安全的。现代密码学采用密钥解决这个问题。密钥用K表示,k1称为加密密钥,k2称为解密密钥,如果K1=K2,或者k2能从k1推算出来,反过来也成立,则这样的算法叫对称算法。如果k1不等于k2,并且k1与k2不能互相推导出来,则这样的算法叫做非对称方法,也叫公钥算法。
密码分析:不知道密钥的情况下,回复出明文的科学。
隐写术:将秘密消息隐藏在其它消息中。最常见的就是在图像中隐藏消息,window下用copy命令直接可成功。
三、 密码学的七个重要工具
密码学的七个重要工具分别是:对称密码、公钥密码、单向散列函数、消息认证码、数字签名、证书和伪随机数生成器。
1. 对称密码
对称密码(symmetric cryptography)是指在加密和解密时使用同一密钥的方式。它是最常见的一种加密方式,通过将信息编码,利用公开的加密算法和保密的密钥完成对信息的加密和解密,其中加密过程和解密过程是对称的,因此被称为对称密码。
这里出现了公开的加密算法的概念,人们通常存在一种错误的观点,即保密的加密算法具有更高的安全性,这被现代密码学称之为"隐蔽式安全性"。因为保密的加密算法只要被使用,迟早会公诸于世,想依靠对密码算法本身进行保密来确保机密性的密码系统也就土崩瓦解了。相反,如果加密算法从一开始就没设想过要保密,则它会得到各种攻击的洗礼,从而实现更强的保密性。因此现代密码学的加密方式基本以"公开加密算法+保密密钥"组成。
组成:公开的加密算法+保密的密钥;
加密过程:A向B发送加密信息t时,需要利用加密算法和密钥对t进行加密;
解密过程:加密过程的逆过程;
优点:巨大的密钥空间能够抵御暴力破解、算法上没有弱点可以抵御其他类型的攻击、加解密运算效率高等优点;
缺点:密钥配送问题(这也是必须用到其它密码技术的原因);
常见密码算法:DES、AES等;
用途:加密信息;
2. 公钥密码
公钥密码(public-key cryptography)是指在加密和解密时使用不同密钥的方式,与对称密钥正好相反,因此也被称为非对称密码(asymmetric cryptography)。
组成:公开的加密算法+公开密钥(公钥)+保密密钥(私钥);
加密过程:A向B发送加密信息t时,需要利用加密算法和B的公钥对t进行加密;
解密过程:B需要利用解密算法(通常与加密算法相同)和B的私钥对t进行解密;
优点:解决了密钥配送的问题;
缺点:加解密算法效率低(意味着它无法直接用于信息加密),中间人攻击(B无法确定密文是由A发来的,因此需要引入新的安全技术);
常见密码算法: RSA等;
用途:加密对称密钥等;
3. 单向散列函数
首先说明,后面这几项技术都不是直接用于加密的。单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息,输出称为散列值。它通过一个不可逆的函数y=f(x)将x映射为y,通过对比传输前后y的变化来判断x是否被篡改。举个例子:假设A要传输t给B,并且要能够让B判断传输过程中是否有人修改过t,那怎么做呢?A可以利用单向散列函数,求出y=f(t),并将t和y一起发给B;B得到t和y后,利用f(t)=y1,判断y和y1是否相同,不同则说明传输过程中t或y出现了错误,信息不完整,相同则说明传输过程中t没有被修改过。
组成:单向散列函数;
优点:算法效率高、辨别篡改;
缺点:无法辨别伪装(这就需要新的安全技术来保证);
常见密码算法:MD5、SHA1等;
用途:判断篡改、基于口令的加密、消息认证码、数字签名等;
4. 消息认证码
说到这里,B仍然无法确定与他通信的人是A。那如何认证A就是A呢?本节介绍的消息认证码(message authentication code)是一种确认完整性并进行认证的技术,简称MAC。它的思想很朴素,为了确保完整性,需要MAC与信息内容相关,为了能够认证,可以利用公共密钥来提供。很显然,MAC可以用单向散列函数与密钥的组合来实现,这也是现实中MAC的一种实现方案。
组成:完整性技术(单向散列函数等)+保密密钥;
加密过程:将密钥作为完整性技术的种子引入,从而得到MAC;
认证过程:将信息t做相同的操作,并与传来的MAC对比,辨别伪装;
优点:辨别篡改和伪装;
缺点:存在密钥传递的问题,当然可以引入公钥方案解决,但又会引入中间人攻击的问题(这也是数字签名的作用)。另外也存在无法防止否认的问题;
常见密码算法:HMAC等;
用途:判断篡改、认证;
5. 数字签名
上一节提到了一种认证方案,但在某些场景下还存在诸多不足,如无法防止否认、无法抵御中间人攻击的问题。无法防止否认是因为密钥相同,无法判断谁发出了这条消息,因此将密钥分开为加密密钥和解密密钥就可以解决无法防止否认的问题。这是不是跟公钥密码很相似,可以将数字签名看成是公钥密码的反过程,用私钥加密来生成签名,用公钥解密来验证签名(这也要求不对称加密算法可逆,由此可是RSA多牛逼)。但前文讨论过RSA算法效率不高,因此数字签名的做法通常:单向散列函数+RSA算法。
组成:单向散列函数+公钥密码算法+公钥;
加密过程:A将信息t经过单向散列函数运算得到h,利用A的私钥对h加密得到数字签名s;
认证过程:B收到t和s,利用A的公钥对s进行解密,再将t散列,对比两者是否一致即可。
优点:能够识别篡改和伪装,还可以防止否认;
缺点:由于用到了公钥密码,那仍然无法理想的解决中间人攻击,因此提出了证书的概念;
常见密码算法:RSA等算法组合;
用途:各种需要认证的场景;
6. 证书
通过上面的讲解可以看出,密码学的基础是对称密码+公钥密码,但它们仍然无法抵御中间人攻击,也即M想办法阻断A和B的直接通信,同时伪装成B然后与A通信,伪装成A然后与B通信。这个问题在密码学看来就是个死循环,因此需要引入额外的技术――社会学知识:让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施(public key intrastructure),简称PKI。而证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。
7. 伪随机数生成器
前面介绍的几项技术仿佛能保证信息的安全性,但其中仍然存在着坑:密钥的由来以及各种算法参数的由来。很显然,如果它是由特定的序列来生成的,那么攻击者很容易就能推测出密钥。那如何才能让攻击者没法推测出来呢?那就是用随机数。可又出现了一个问题,怎么得到随机数呢?一次次的扔硬币肯定不行,那还是需要一个算法来快速的生成类似随机数的数,这就是伪随机数生成器。因此这个伪随机数生成器的算法还是需要一番功夫的,这里就不再赘述。
四、 现代密码学常见的密码算法
1. 对称算法
对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密。
(1) DES:DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是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。
经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
此算法是对称加密算法体系中的代表,在计算机网络系统中广泛使用。
(2) AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AddRoundKey ― 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
SubBytes ― 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
ShiftRows ― 将矩阵中的每个横列进行循环式移位。
MixColumns ― 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。
2. 非对称算法
非对称密钥也叫公开密钥加密,它是用两个数学相关的密钥对信息进行编码。在此系统中,其中一个密钥叫公开密钥,可随意发给期望同密钥持有者进行安全通信的人。公开密钥用于对信息加密。第二个密钥是私有密钥,属于密钥持有者,此人要仔细保存私有密钥。密钥持有者用私有密钥对收到的信息进行解密。
(1) RSA:RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
因为两个大素数的乘积因式分解时,除了1和其本身(这两个不在分解范围内)外,只有这两个大素数,但是分解时不知道这两个大素数,只有从最小的素数2开始,逐步试除,直到这两个大素数中较小的一个,当然非常困难了。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1modn;B=A^e2modn;
3. 哈希算法
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。简单解释:哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。
(1) MD5:MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
(2) 2SHA-256:安全哈希算法256位。SHA-1安全性比MD5稍高(160位VS128位),但算法需要时间SHA-1稍慢。
五、 密码分析详解
密码编码学的主要目的是保持明文(或者是密钥)的秘密并防止窃听者(也可以叫对手、攻击者、截取者、入侵者、敌人等)知晓。这里假设窃听者完全能够截获发送者和接收者之间的通信。
密码分析学是在不知道密钥的情况下,恢复明文的科学。成功的密码分析可以恢复消息的明文或者密钥。与此同时,密码分析也可以验证出密码体制的弱点,并最终恢复明文或者密钥。
对密码进行分析的尝试称为攻击(attack)。A.Kerckhoffs 早在19世纪就阐明了密码分析的一个基本假设,此假设就是秘密必须全寓于密钥中。Kerckhoffs假设密码分析者已知密码算法以及其实现的全部资料。虽然在实际的密码分析中并不总是拥有如此详细的信息,但理应如此假设。这样如果不能破译算法,那么即便了解算法是如何工作的也是徒然。当然,如果连算法的知识和相关资料都没有,那就肯定无法破译。
现我列出常用的七类密码分析攻击,在此假设每一类密码分析者都知道所用的加密算法的全部知识。
唯密文攻击(ciphertext-only attack)。密码分析者有一些消息的密文,这些消息都用相同的加密算法进行加密。密码分析者的任务就是恢复尽可能多的明文,或者最好能推算出加密消息的密钥,以便可采用相同的密钥破解其他被加密的消息。
已知明文攻击(known-plaintext attack)。密码分析者不仅可得到一些消息的密文,而且也知道这些消息的明文。分析者的任务就是用加密信息推出用来加密的密钥或导出一个算法,此算法可以对用相同密钥加密的任何新消息进行解密。
选择明文攻击(chosen-plaintext attack)。分析者不仅可以得到一些消息的密文和相同的明文,而且还可以选择被加密的明文。这比已知明文攻击更加有效,因为密码分析者能选择特定的明文块进行加密,那些块可能产生更多关于密钥的信息。分析者的任务就是推导出用来加密消息的密钥或导出一个算法,此算法可以对用相同密钥加密的任何新消息进行解密。
自适应选择明文攻击(adaptive-chosen-plaintext attack)。这是选择明文攻击的特殊情况。密码分析者不仅能够选择被加密的明文,还可以基于以前加密的结果修正这个选择。在选择明文攻击中,密码分析者还可以选择一大块被加密的明文。而在自适应选