🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
第四章 密码学基础
4.1密码学概述
下面我们来学习密码学基础。
首先来看密码学概述。什么是密码学密码学的英文单词?Cryptology来自于两个希腊文单词,一个是accepts,一个是logos。分别的意思是隐藏信息,所以密码学主要就是用来隐藏信息的。密码学分为两个分支,photography、密码学、密码加密学,另外一个分支就是crypto analysis,密码分析学。
这里介绍一下密码学的相关基本术语,明文就是我们要保密的信息,加密就是伪装信息隐藏内容的过程。密文就是经过加密后的信息解密,就是把名文解密就是把密文还原为明文的过程,还需要有加密源或者密码源。另外还需要有密码算法,用于加密或解密的数学函数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DBGsNv7w-1687880439658)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
上图是加密通信的模型,加密的目的就是让信源和信速在不安全的信道上面进行通信,而攻击者密码分析员不能理解他们通信的内容。下面这个图就是这样一个简单的模型,信源信速就是通信的两端,信息的源头和信息的目的,他们双方要进行通信,然后采用公开信道来通信,电话网络,互联网络就是公开信道,我们前面讲只要有网络的地方就有网络安全威胁,所以公开性到被认为是不安全的,存在攻击者,针对保密通信而言,攻击者就是密码分析员或者叫做破解员。为了能够安全的通过公开信道来通信,信源需要把它的明文信息使用一个加密器加密成密文之后,然后把密文放到公开信道上面去传输,然后接收方杏树收到密文之后,再用解密器把它还原成明文,这样完成信息的解读。信源加密迅速解密需要一个密钥k这个密钥k需要一个秘密的信道来进行传输,从而保证密钥的安全。
接下来我们来看密码体制,密码体制可以表达为一个5元组,pckedp代表明文空间,就是可能明文的有限级或者说是明文的字符集,c就是密文空间可能密文的有相机,k是密钥空间,可能的密钥构成的有限机,另外还需要有一个加密算法和解密算法,同时保证这个用加密算法加密一个信息,然后我们用解密算法能够把它还原回来,实现加密和解密的可逆操作。e代表加密算法,d代表解密算法,还要满足加密算法和解密算法是一对可逆的操作,也就是说用加密算法加密一个信息,我们用解密算法正好可以把这个信息还原出来。
我们来简单分析一下密码学的本质,密码学的本质就是使用密码算法对密文明文进行变换,有这个用于加密和解密的数学函数。
我们加密就是用一个密钥,k对明文进行一个加密运算,得到密文,而解密就是把这个密文用密钥k来做一个解密,算还原出明文。我们数学里面的数学函数通常形如y等于fx给一个x我们就可以通过运算 y给计算出来,有些函数它是可逆的,然后给一个y我们可以再通过运算把x给还原出来,这个正好跟加密解密是类似,所以加密解密函数嗯您再重新说一下。刚才说我们在数学里面都学过数学函数,形如y等于fx根据这个函数的话,我们任意给个x我们就可以计算出一个y来,有些函数它是可逆的,通过这个可逆的函数,我们给一个y就可以把x给计算出来。加密解密正好是这样一对可逆的函数。
4.1.1密码算法的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTXTV0Kd-1687880439659)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]
我们首先从保密的内容的角度来看一下密码算法的分类。加密就是对明文消息用一个密钥k买它做一个加密算,这个过程当中有两个关键的要素,一个就是算法e,另外一个就是密钥k。从保密的内容上面来分的话,可以从密钥和算法两个角度来进行保密。所以可以分为受限制的算法和基于密钥的算法,受限制的算法也就是对算法来保密。但是要保密,算法实际上是比较困难的,因为构造一个算法是比较复杂的,今天算法的数量我要重新做一下,算法往往是比较复杂的,所以构造一个算法并不是太容易,所以今天算法的数量还不是非常的庞大,所以后来的很多密码算法,主要保密是对密钥进行保密,算法保不保密不重要,甚至很多算法是公开的,只要密钥是保密的,密码算法就是保密的。
基于密钥的保密性的算法可以分为两类,一类是对称密码算法,也就是加密和解密的过程是对称的,加密和解密的密钥是相同的,或者从一个易于推导出另外一个,又称为这个秘密秘钥算法或单秘钥算法。我们典型的后面要讲的DES、AES它们就是对称密码算法。另外一类算法就是非对称密码算法,非对称密码算法,加密密钥和解密密钥不相同,或者从其中一个推导另外一个是很困难的,又叫做公开密码算法。我们典型的RSA、ECC等等这些算法就是非对称密码算法。
按照对明文的处理方法来分类的话,可以分成分组密码和流密码,分组密码是将我们要加密的明文分成固定长度的组,用同一个密钥和算法对每一组进行批量的加密,然后输出固定长度的密文块,一组明文数据加密完了之后再加密下一组。另外一类叫做流密码,又称为序列密码,它每一次加密移位或者一个字节,它是一一位一位或一个字节一个字节的加密。
4.1.2 密码分析
接下来我们来看密码分析,密码分析实质就是破解,目的是利用密文发现密文,利用密文,发现密钥实际上就是利用密文去破解明文或者破解密钥。
密码分析有一个Kerckhoff原则,就是假设破译者已知密码体制,既掌握了加减密算法,因为我们构造一个密码算法非常的困难,所以要对密码算法进行保密很困难。所以后来很多密码算法都是基于密钥保密性的,也就是说我们只要密钥保密就可以了。
根据破译者具备的前提条件,我们通常将密码分析攻击分为如下4种类型:
按照强度递增的顺序,首先是维密文攻击,攻击者掌握了一段或几段密文,通过密文分析得出明文或密钥k的过程。这种攻击由于掌握的信息很少,通常只能采用穷举攻击,也就是暴力攻击。
第二种就是已知明文攻击攻击者,他掌握了一个或者多个明文串和相应的密文或者特定的明文模式,比如特定文件头的格式,软件的版权声明等等,这个时候掌握的信息更多了,它就可以去分析加密密钥。
接下来就是选择明文攻击,攻击者,获得了对我们加密机的暂时访问权,他就能够选择或者构造明文串,然后用加密机加密出相应的密文串。采用差别比较分析法,加密一组差别细微的明文,可以帮助攻击者更快的破解密钥。
最后一种就是选择密文攻击,攻击者能够暂时的接近解密机,然后选择任何的密文串,然后构造出相应的明文出来。这种攻击方法它掌握的信息更多,它就可以更快的对密码算法进行破解。
接下来我们来看一下密码算法的安全性,密码算法的安全性可以分为三大等级,第一级是无条件安全,也就是说不管破译者,他掌握了多少的资源,包括计算、存储、密文等等,它都是无法破译密码算法或者密码体制的。而且即使被破解了,破译者他也是没有办法验证结果正确与否的,这个就是无条件安全。只有one time pay的,一次一密,这种加密算法它是无条件安全的,一次一密就是说一个密钥它只使用一次就不再使用了,所以破译者即便他把这个密钥给破解了,但是这个密钥由于使用一次就不再使用了,下一次又是一个新的密钥,破译者又要从头开始,所以一次一密这种加密体制它是无条件安全的。
计算上对无条件安全很难达到,像一次一密使用的成本开销都非常高,所以后来又产生了计算上安全的密码算法。这类算法对于拥有有限资源的这个破译者来说,是安全的,一方面破译的代价超过信息的本身价值。另外一方面就是破译的时间超过信息的有效期,如果我们破译的代价超过了信息本身的价值的话,这个就可以从根本上打消我们破译者他破译攻击的动机,这个时候算法也是安全的。另外如果破译的时间超出了信息的有效期的话,这个破译也是没有意义的,或者说是没有收益的。比如说我们举个例子,比如说我们有一张彩票明天就要开奖了,攻击者用他的技术,他的计算资源,它可以把它破解出来,但是它可能需要两天或者三天的时间。虽然它可以把这个彩票破译出来,但是是没有意义的,因为破解出来就过期了。
第三类是可证明安全性,就是算法的安全性可以归结为某个已经深入研究的数学难题。攻击者要想破解这样的密码算法的话,它的难度等价于去破解这个数学难题。由于是数学难题,所以我们可以从数学上面去证明它的难度和这个安全性。典型的数学难题就是大数分解和背包问题,说我们后面的有些公钥密码算法,比如说RSA,它就是基于大整数分解的数学难题的。
4.2 密码学的发展
4.2.1古代加密方法
大家都听过姜太公钓鱼的典故,姜子牙除了钓鱼之外,他还发明了用鱼竿传递军事情报。根据这个太公六韬记载,姜子牙将鱼竿制成不同长度的树结,不同的长度代表不同的含义,用来传递军事机密,比如最长的友谊,此长代表战争取得大胜,而9寸代表破阵平,将5寸代表请梁一冰最短的3寸代表斯利王土。姜子牙除了鱼竿传君情之外,姜子牙还发明了阴书加密技术,他把情报文字切分成三份,分别让三个人走不同的路径来传送。收信人接收到三份情报之后,把它拼接在一起,就可以得到完整的情报。采用这种加密技术信息传输方式的话,只有在三个人都被截获的时候,才会造成情报的泄密,从而保证了从而在一定程度上面保证了信息情报的完整性和保密性。
我们再来看一下一种早期的吸纳变换密码叫做Scytale密码,它使用一个圆柱将一个纸条环绕在圆柱上面,然后信息沿着圆柱横向来写,然后把这个圆柱抽开,纸条上的字母就呈现出了随机的一种形态。接收方在接收到这样一个纸条之后,然后找到相同粗细的圆柱,然后再把纸条缠上去,这个时候信息就可以还原出来。这个是这个 Scytale密码的实物图,这种加密方式并不十分安全,它的密钥实际上就是纸条和我们圆柱的粗细,只要我们得到了这个纸条,再去找不同粗细的圆柱,实际上就很容易把这种加密方式给破解。早期还有一些几何图形密码,以一种形式写下信息,而以,另外一种形式去读取信息。比如说这个图当中所示的,按照横向一行一行来书写信息,然后按照纵向一列一列的去读取信息,这个时候就把信息进行了变换。还有按照蛇形的方式,或者按照这个暖气管道的方式来书写和读取信息。实现信息的变换,隐藏信息的内容。这些变换方式比较简单,要破解它也不是什么难事。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bbGJyfo-1687880439660)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]
接下来我们看一下公元前二世纪希腊人帕利比奥设计的棋盘密码,它将表达明文的字母放入到一个5×5的棋盘上面,然后在加密的时候把明文字母编码成棋盘上面对应的横纵坐标。当然Polybius的棋盘应该是放在希腊文字这里,我们为了讲解放的是英文字母,同学们感兴趣的可以用这个其他密码来加密一下我们学校名称USTC或者是你们英文的名字。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZxysDyf-1687880439660)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]
4.2.2古典密码概述
接下来我们来介绍古典密码。古典密码阶段的核心思想就是移行换位。什么是移行换位?主要是两种变换,一种是代换,另外一种是置换。
什么是代换?就是明文内容的表示形式改变,而内容元素之间的相对位置是不变的,也就是把表达明文的这个符号或者字母用密文中对应的字母来进行替代。比如刚才讲的Paddy bills的其他密码,它实际上就是一种代换密码,我们如果对学校名称uestc进行加密的话,实际上就是把我们明文的这几个字母对应的把它一一的转变为密文的符号,u把它替代为45,然后这个一替代为15等等,这就是一种典型的代换。
代换通常可以用如图的逻辑变换来表达,命名为s-box,表示实时代换的逻辑和。这里这个示例当中我们这个代换的核数是三位的二进制,三维二进制表达范围就是07,我们这个代换和就是可以实现吧07这8个数字把它代换为另外的8个数字,比如说这个图当中,0就固定的把它转换为4,而一就把它转换为这个6等等,在我们这个事例当中,我们输入的三维二进制是001,也就是数字的一,所以针针对这个输入就把这个一转换为6,然后输出的二进制就是110。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7avE0ZR-1687880439660)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]
我们再来看置换,置换就是明文内容元素的相对位置的改变,而内容的表示形式不变,换句话说就是我们用来表达明文的字符,它的位置发生变化,而这个字符本身不变。这个事例重新说一下,我们还是拿我们学校的简称uestc来作为私利,如果采用置换的话,我们这个学校名称的每一个字母我们都不去变它,而仅仅把它的位置给它打乱,就实现了对学校名称它的含义的一个隐藏。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nea28dJi-1687880439661)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]
置换通常可以用如右图所示的这样一个逻辑和来进行表达。P-box专门用来做置换的。在这个示例当中,输入有15位二进制,批核就可以实现把这个输入的15位二进制顺序给它打乱,然后产生一个对应的置换输出。像这个事例当中我们输入的二进制只有第一位是唯一,其余全部零。置换把这个全部打乱之后,就把这个输入的一置换到了中间的这一位,产生了这样的二进制输出。
4.2.3凯撒密码
下面我们就来介绍一下典型的代换密码,包括凯撒密码反射密码,单表置换和多表置换。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEqrifve-1687880439661)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fe8xWO4j-1687880439662)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)]
首先我们来看凯撒密码。凯撒密码是一个循环移位密码,它将字母表首尾相连,然后将这个明文字母替换为它右边的第k个字母。如上面这个示意图,我们把这个字母固定的映射为d这个示例当中我们把这个字母固定的映射为它后面的第三个字符,比如说 a我们就固定的把它加密为地,相应的b就按照顺序往后移,b就加密为了e ,c加密为f,首尾相连,所以最后的几个字母xyz又分别的加密成了ABC。它是由一个凯撒密码的一个实物,两个同心的圆盘构成的,外圈就是明文字母,而内圈就是对应的我们加密后的密文字母,这个加密可以用一个数学公式来进行表达,把这个明文字母它的序号,再加上这个它要移位的位次,也就是这个 k就是它的密钥就是a加k然后还要做一个模运算,因为它要首尾相连,所以做一个模运算,模26,因为明文字母有26个,解密就用相应的下面这个公式,就是密文字母,然后它的序号减去这个密钥k然后再把它做相应的密算,就可以得到它的明文。
这里我们就来看一下凯撒密码加密的简单事例,假设密钥k=3,我们要加密的明文是computer system,我们加密的时候就一个字母一个字母的加密,首先加密c我们这个字母的编号从0开始属于c的编号就是二,然后二加上密钥k3就得到了5,然后再模除26还是等于5,所以加密出来c就是加密成了 f同样o它的字母序号是14加上3,然后得到17,加密后的密文就是二,然后我们m加密后就得到了p不断的这样加密下去,最后我们就得到了密文,就是frpsx然后whu等等这样一串。然后我们如果要对这样一串密文进行解密的话,我们就根据刚才看到的那个公式,然后再把密文字母它的序号分别减去这个密钥k三,然后再来经过模运算就可以把这个明文还原出来,这个是我们凯撒密码算法具体的使用过程的一个事例。
这里是凯撒密码的具体的一个事例,假设凯撒大帝要收全方军事传来的一个军事情报,这个情报的内容就是meet me after the tiger party。前方军事就用这个凯撒密码的这个圆盘,经过这个相应的加密处理,得到密文,thhwph等等这么一串,然后就把这么一串加密后的密文通过情报传递发送给凯撒大帝。我们凯撒大帝收到这样一串密文之后,用相同的这样一个凯撒加密的圆盘,然后把它还原出来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwewgTqA-1687880439662)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg)]
这个凯撒密码它的安全性如何?我们来看一下凯撒密码的破解,凯撒密码我们刚刚看到它就是这个循环移位,而字母表有26个字母,所以循环移位移位26次之后,它就回到了原来的位置,所以凯撒密码它只有25种这个怎么样?移位方法。所以我们在破解的时候,我们只需要一一的尝试,第一次尝试以一位,第二次尝试以两位第三次一三位等等,然后就最终最多25次就可以把凯撒密码加密后的密文给破解出来。像刚才的事例当中,我们前方均是发给凯撒大帝的密文,我们只需要移位三次,当密钥k等于3的时候,我们就可以把这个明文测试出来。
4.2.4仿射密码
接下来我们再来看仿射密码,刚刚看到的凯撒密码使用的函数很简单,fx等于x加k这个密钥空间25太小了,非常容易破解,于是就想到了仿射函数fx=ax+b这也是一个简单的函数。凯撒密码也是一种特殊的仿射函数,当 a=1的时候,它就退化成了凯撒密码,我们就可以使用这样一个仿射函数来对信息进行加密。选择两个参数,k1、k2,其中k1需要与26互素,k1、k2分别作为我们仿射函数的a和b这两个系数,就进行加密了。利用仿射函数用k1乘上要加密的信息,然后再加k2,最后再把它模除26。因为加密主要也针对英文字母26,有26个英文字母。根据这个加密函数,我们可以把这个解密函数,也就是加密函数的逆函数求出来。解密函数就是k3乘上密文c减去k2,然后再模除26,其中k3*k1模除26等于1,也就是说k3和k1是互为这个模除26的一个逆缘。刚才提到这个 k1要与26互素, k1和26的最大公因数是1,比如说这个5、7,包括这个19、15等等,都是跟26互素的,这个条件实际上是要保证加密解密的可逆性的一个必要条件。为什么是这样?我们举个反例,假设k1=2,这个时候2跟246不互素,2跟246他们有个公因子,92,当我们k1取2的时候,先不管这个 K二取值,我们先来加密一下两个字母,比如说我们取两个字母,分别要加密这个字母b和这个字母o字母b和字母o它的序号分别是1和14,所以我们先看加密b的结果,Nama加密bea得到的密文CD它就=2×1,加上k2,然后再来模除26,可以进一步的推导出来,就等于2加上k2,再来模除26。我们再来看字母o加密出来,它的密文是c2,等于2×14,再加上k2,再来模除246,它是等于248加上k2再模除246的。根据模运算的性质,我们可以把这个模26先放到小括号里面去运算一次,所以c2最后就等于2加上k2再模除26,发现c1和c2两个是相等的,也就是说当k1=2的情况下面,我们加密两个不同的字母b和o结果得到了相同的蜜文,那这个时候实际上就产生了冲突。用一个加密算法,加密两个不同的信息,得到相同的密文,这个时候加密和解密就不可逆了,这个加密算法实际上就不可行。把 c1c2相同的解密成b还是解密成o?所以这个情况是不可以的,k1和26必须是互素的。
接下来我们分析一下仿射密码的密钥空间,仿射密码使用仿射函数有两个参数,所以仿射密码它的密钥空间就是k1的个数乘上k2的个数。k一我们刚才看到它需要与26互素,并且它会做模运算,所以 K的有效取值的范围就是025之间,并且与我们26互素的这些数因为超过26,这个时候它跟我们26范围之内的就是等价的。k1最后取值出来就是3、57等等这样一些数,共有12个。我们再来看k2,k2的取值范围跟凯撒比较类似,但是凯撒密码当中这个密钥它是不能取0的,因为取0之后相当于就没有变化,但是仿射密码当中由于有k1的存在,所以k2它是可以取0的,所以k2的取值就是025,总共有26种取值所以,仿射密码的密钥空间就是12×26=312。相对凯撒密码来说,我们仿射密码它的密钥空间就大多了。
我们再来看仿射密码如何来破译,仿射密码的破译跟我们刚才的凯撒密码破译是一样的,虽然空间大了很多,但是总共只有312,同样可以采用暴力破解密码猜测的方式,一一的把k1k2的取值全部的尝试一遍,就可以把这个仿射密码破解出来。
4.2.5单表置换
接下来我们再来看单表置换。前面讲的凯撒密码反射密码,密钥空间都太小了,很容易被破解,所以后来就产生了单表置换这种加密方法,这个加密方法它在算法当中会维护一个置换表,这个置换表记录了我们明文与密文的对照关系。
看一下单表置换的一个事例,假设密钥词组是I love my country,这个置换表它是一个两行的表格,第一行就是明文字母,从ABC一直到xyz第二行就是密文字母,首先将密文词组去除重复的字符y然后把它分别填入到第二行,然后接下来再把字母表当中没有在密文,然后接下来我们再把我们剩余的字母,接下来我们再把没有出现在我们密文词组当中的字母,按照字母表当中顺序再填充到密文字母这一行当中,然后就构成了置换表。使用这张置换表去加密的时候,就把明文这个信息逐个字母的把它兑换成我们密文字母。我说最后再说一下刚才这个加密,哈嗯构造好了这张置换表之后,我们在加密的时候,就可以把我们要加密的明文信息,逐个字母的把它替换为这个置换表当中对应的密文字母,就可以实现加密了,得到相应的明文串。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXZ40jOH-1687880439663)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)]
介绍完这个单表置换算法之后,请同学们思考两个问题,第一个问题就是我们这个单表置换算法与凯撒密码反射密码的区别在哪里?第二个问题就是我们单表置换加密的密钥空间有多大?针对第一个问题,单表置换与凯撒反射密码,它的区别就是单表置换没有办法把它总结为一个简单的数学函数,没有简单的加密函数的话,我们就不能像凯撒或者反射那样,从这个函数当中然后去找它的密钥,然后去进行这个进行破解。第二个问题,单表置换算法它的密钥空间有多大?这个问题等同于我们这个置换表它有多少种构造可能,这个实际上它是一个排列组合问题。我们这个构造置换表的时候,a有26种加密方式,b有25种,c有24,然后接下来23等等。最后整个置换表它的构造的可能性总共是有26的阶层,这么大一个数字,这个密钥空间是非常庞大的。我们刚才看到单表置换它的密钥空间非常的庞大,是一个天文数字,所以要采用暴力破解的方式就非常的困难了。单表置换是不是就非常的安全?并不是这样的,要破解单表置换的话,可以从自然语言的特点入手,我们人类的自然语言存在着高冗余性,自然语言当中的字母以及符号出现的频率是不一样的,具有统计规律,我们单表置换明文字符,单表置换算法,明文字符会固定的加密层,固定的密文字符。使用我们单表置换算法,明文字符会固定的加密为密文字符,比如这个表当中a会固定的加密成这个 Ab会固定的加密成这个 LC固定加密成o这个时候明文当中的统计规律就会传导到密文当中去,从而让密文同样保留了我们自然语言的统计规律。包括我们这个单表置换算法在内的代换密码破译的三大要素,就是频率特征、连接特征和重复特征,频率特征就是我们各种自然语言当中,它的这个字母或者说符号,它的使用频次是不一样的。另外连接特征就是前后字母存在一定的关联性,比如我们英语当中我们字母q后面肌肤,比如我们英语当中,字母q后面几乎100%会连接u而x前面几乎总是会出现I或者e只有极个别的情况下面会是o和a而两个e之间,我们r出现的频率是非常高的。另外还有重复特征,就是两个字符以上的字符串重复出现的现象,比如说英文当中的th或者the或者tion、tious等等,这些是频繁出现的,这些就是统计特征。我们接下来再来看英文字母的统计频率,根据一些统计,在英文当中这个字母e它的频率是出现的最高的,其次是t,a,o,I,n,s,h,r等等,出现频次比较低的是z,q,x,j等,它们的频率几乎是接近0。
我们在使用这个统计规律在进行攻击或者破解的时候,可以采用如下的步骤。第一步就是我们首先统计密文当中字母出现的频率,然后将这个统计结果与我们自然语言当中的频率进行一个对比,我们就可以确定部分的密钥。第二步是在第一步的基础上面,我们结合一些连接特征和重复特征,再来确定部分密钥。第三步是在前面两步的基础上面,再从密文上面来猜测其他的密钥,用这种方法我们来破译凯撒密码或者破译仿生密码的话,我们只需要识别几个字母,我们就可以把整个密码给破解。比如说我们识别a-e-i和r-s-t等等这些三元组,或者识别jk和xyz的特征等等,我们就可以获得密钥。因为可以把凯撒密码总结为一个简单的数学函数,只要我们通过频率特征,我们去破解了其中的几个字符,就可以把它带入到公式当中去,把相应的密钥给计算出来。用这个统计方法来进行攻击的时候,要破解单表置换密码,就要稍微麻烦一点,因为我们单表置换密码我们可以看到,在置换表当中,每一个字母它都会映射到不同的密文字母,所以在破解的时候就需要确定每一个字母它被加密成哪一个字母,这个时候双字母三字母的频率特征都比较有用了。
接下来我们看一下字频统计攻击的一个事例,假设我们得到了如下这样一段密文,根据这个频率特征,我们发现在密文当中 p和z频率是最高的,怀疑 p和z对应的是e和t。我们又发现这个密文当中zw以及zwp出现的频率是比较高的,这个时候结合这个语义,我们就猜测这个zw是thzw p就是the。进一步结合这个频率特征以及前两步得出来的部分结果,结合语义,我们进一步猜测sumh可能对应的是a、h、i、n、o、r、s我们继续结合语义和这个频率特征,我们推测这个 abgyig可能对应的是bjkqvxz到这儿我们就把全部的明文字母都给它破译出来了,然后我们可以看一下它是比较通顺的,这个时候就说明我们这个破解完成了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7S4xvz0-1687880439663)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)]
4.2.6维吉尼亚
我们前面介绍了单表置换密码,单表置换密码将明文字母固定的映射为密文字母,所以这个自然语言当中的统计特征就会被带入到密文空间当中,从而使代表置换容易受到自屏攻击。所以后来法国的外交官维吉尼亚就提出了多表置换密码,典型的多表置换密码是将一个明文字母映射为多个密文字母,这里密钥k等于k1,k2到kn由n个字符组成的一个字符串。假设明文是由r个字符组成的这样一个明文串,我们将明文首先根据密钥的长度把它分为n位的若干个分段,然后每一个分段来进行加密。在一个分段之内,我们就将这个这一段明文跟密钥一一的来进行这个相加,ci等于mi加上ki,然后再模除26,其中mi和ki都是这个明文字母和这个密文字母它的序号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rj2a0dTj-1687880439664)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)]
这里我们来看一个事例,假设密钥是deceptive这样一个单词,然后我们要加密的明文是we are discovered save yourself。首先我们把明文按照密钥的长度分成了三段,然后接下来我们把每一段都跟这个密钥词组来进行这个运算,比如说第一个分段,我们就首先来处理第一个字母w,然后把w它的字母序号加上密钥d的字母序号,然后再来模除26,然后加密出来的结果就是 z的这个序号,所以密文就是z同样这个第二个字母e就跟它对应的密钥,e两个来做运算,得到它的密文字母就是I按照这样的顺序,按照这样的方式重复下去,我们就可以得到完整的密文串。
维基尼亚提出的这个多表置换算法,它的安全性怎么样?由于这个算法在不同位置上的同一名文,使用不同的密钥来加密,所以不同的明文它得到的密文是不一样的,这个时候字母的统计频率就被模糊了,但是并没有完全消失。因为我们要加密的明文往往是由多段构成,而每一段都用相同的密钥词组来加密,所以在不同段的同一位置所使用的密钥字母是相同的。这里我们可以看一下,假设密钥长度为d这个时候我们明文当中的di位,第I加d尾,a加2D位等等。这些名文它是用相同的密钥来加密的,就是 Ki来加密。假设这些位置上的明文如果是相同的话,由于密钥相同,势必他们得到的密文也是相同的,也就是说在明文分段的同一位置,这个字母的统计频率仍然是被保留到了密文空间当中。
这里我们还是通过刚才的事例来说明我们刚才的明文是we are discovered save yourself。分成了三段,密文是diss empty vl。我们把明文的三个分段把它按照行列的方式,我们把明文的三个分段把它排成一个三行的矩阵,然后在进行加密的时候,我们会发现在这个矩阵当中的同一列是用相同的密文字母来加密的,
这个矩阵的第一列都是用密文词组的d字母来加密,矩阵当中的第5列第6列都是用 p和t来加密的。我们看到第5列当中,前面两个字母都是e它都是用p来加密的,它得到的密文字母都是t同样我们第6列的第一行第二行都是d用密文字母t来加密都得到了w所以我们通过这个事例我们可以看到在明文空间当中的同一位置的字母,由于用相同的密文字母来加密,所以它们会得到相同的密文字母。这个时候在明文空间当中,同一列当中的统计特征就会传导到密文的空间当中去,具体就是传导到密文当中的同一列当中。由于自然语言的统计特征依然保留在了维基亚密码的列当中,所以我们可以在列当中去实施制品统计攻击,从而去破解维基尼亚密码。
这里是普鲁士的少校卡西斯基,基于刚才的思路提出的针对维基尼亚多表置换密码的破解方法,具体的方法我就留给同学们下来自己去学习。
4.2.7 一次密码本
接下来我们来介绍一次密码本。前面看到的维基尼亚的多表置换仍然是不够安全的,所以后来又产生了一次密码版,又叫一次一密,它的名称来源于特工携带的密码本,特工在工作活动的时候使用这个密码本来加密获取的信息或者情报,每用一页就把这个缀页撕掉,从而保证这个密钥不被重复的使用,每一次都使用一个新的密钥,所以叫做一次一密。这个密码本是一个大的不重复的真随机密钥字母机这个特工用密码本来加密,接收方也要用相同的密钥来解密,所以这个发送者和接收者都要使用相同的一次密码本,发送者按序用这个密码本当中的密钥字母来加密明文当中的每一个字符,接收者也按序用相应的密钥字母来解密密文当中的每一个字符,一个密码只使用一次,当然这个密码本当中的meal可以是字母,也可以是数字。
这里我们看一个一次性密码本加密解密的一个事例,为了方便进行介绍,我们用数字来进行示例。假设我们要加密的明文是这样一串二进制序列,密钥是等长的另外一串二进制序列,由于三二进制,我们可以用简单的易货运算来对他们进行加密,易货得到的密文就是这样一串二进制序列,要解密就更简单了,因为解密这个时候我们要进行解密的话,由于加密采用抑或运算,所以我们解密的时候再来实施一次易货运算,就可以把明文还原出来。这里是俄罗斯乱数本的一个实物照片,这个俄罗斯的论述本实际上就是俄罗斯的一次密码本,这是其中的一页。我们们可以看到这一页当中有很多这个数字串,这些数字串就是使用的这个密钥。
下面我们来看一下一次性密码本它的优缺点,首先优点,这个密钥与明文是等长的绝对安全,每一次都用一个新的密钥,它的密钥是真随机数,所以产生的密文完全没有统计规律。一次性密码本是唯一的可理论证明的无条件安全的算法。当然它的缺点也比较明显,主要是实现困难,因为要产生大量的真随机密钥,产生真随机数本身就是比较困难的。一般现在依靠一些自然的物理现象去产生,比如说电路的白噪声,量子等等产生的难度很大。另外,一次性密码本要求这个发送方接收方都得携带相同的密码本,携带的开销会比较大,而且难以及时的安全的分发这个大量的密钥,需要让发送方接收方都得有这样一个密码本,分发的开销会比较大。
4.2.8置换密码
我们前面看到的几个算法都是采用代换技术的算法,这里我们来看一看这个基于置换技术的密码,置换技术是通过重排明、文字符的顺序来隐藏信息,它不改变明文字符的表示形式,这样的话它就不会改变这个字母的统计规律。也就是说这个明文当中如果是这个 ets等等这些字母的屏统计频率是比较高的话,在密文当中也是这几个字母它的统计频率是最高的,这是与代换算法的本质区别,可借此辨别是否是置换技术。
我们来看几个简单的置换密码,首先看栅栏技术,栅栏技术将明文按照对角线的方式写成若干行,然后按行输出加密结果。比如下面这个事例,我们要加密的明文,就是我们凯撒密码当中提到的凯撒大帝发送的信息meet me after the tiger party。按照对角线的方式把谜文书写为下面的两行,然后按照行的方式来提取信息,就得到了密文串。
接下来我们看纵行换位,这个算法将明文按照密钥的位数写为若干例,然后按照密钥的顺序来输出割裂。下面我们看一个例子,假设我们要加密的明文是attack postponed until two am.密钥是4312567,根据我们密钥的位数,我们把明文分成了7位7位的分组,然后把这个明文组织成一个取证,然后接下来我们再来按照密钥来提取信息。首先我们提取密钥唯一的这一列 ttna然后接下来再提取密钥为r的列,再提取第3列第4列,最后我们就得到了完整的密文ttna下面这一串。
接下来我们再来看旋转漏格板,这个漏格板是一个方块,其中留下一些小的空白窗口,然后这个旋转漏格板算法,就是通过旋转这样一个漏格板,然后得到不同的窗口,然后去提取明文。这里还是看这样一个事例,明文是这样一串字符串,把明文组织成一个矩阵,把这个 漏板覆盖到明文上面去,然后通过空白窗口,我们就可以提取出一些明文字符出来,提取完之后,我们把这个漏格板再来进行旋转,这个时候这个空白的位置又产生变化,我们jiu又可以提取出一批字符出来,旋转多次之后,就可以把整个明文字符全部提取完,最后就得到了完整的密文。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kd3yfVd-1687880439664)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)]
4.2.9近代密码
完成了对前面古典密码的介绍之后,我们来学习近代密码。
首先我们来看近代密码算法的迭代过程和演进思路,由于自然语言存在统计特征,所以单纯的替换和置换都不能保证安全。思路就是连续使用多种加密算法,以提供更高的安全性,比如多次的代换,可以构造更复杂的代换,多次的置换也可以构造更复杂的置换,通常还要将这个代换和置换交替进行,从而大大的提高安全性,这也是我们现代密码的构造思路之一,这也是我们构造现代密码的基本技术和思路之一。
多次的代换,多次的置换,并且交替使用,后来就产生了乘积密码,乘积密码就是采用多个函数把它们复合起来,例如有n个函数f1、f2到fn,首先把f用来加密信息,然后得到的,结果我们再用另外一个函数fn-1,对它进行处理。再接下来处理fn-2……f2f1最后得到最终的密文交替使用代换和置换,可以实现混乱和扩散,从而破坏对密码系统进行的各种统计分析。这个混乱实际上就类似于搅拌机的效果,使明文密钥密文之间的统计关系变得尽可能的复杂。扩散主要的目的是带来一个雪崩的效应,每一位密钥的变化也尽可能多的影响我们密文的变化。
这里我们看一下乘积密码的示意图,示意图上我们可以看到它实际上就是一个代换置换,反复交替使用构成的一个网络。我们输入是15位的二进制,输入到一个置换p盒子当中,然后置换的结果又把它输入到若干个代换的s盒当中,代换的结果再输入下一个置换盒,进行置换,又来进行这个代换再置换,反复多次的这样交替的处理,最终得到输出结果。接下来我们来看常见的成绩密码,就是迭代密码,一个典型的迭代密码通常包含两个东西,一个就是轮函数,通常包括三个变换,代换置换和密钥混合,然后这个轮番数会反复的去执行。还有密钥编排方案,我们加密都要使用密钥,而密钥并不是一个密钥多次使用,而是基于这个密钥来进行一个编排,产生若干个子密钥,每一轮处理,使用其中一个子密钥。这里是典型的迭代密码的示意图。我们可以看到刚才的核心就是一个轮函数跟密钥编排方案,而轮函数就是把名文分组进行置换代换处理,然后多次的迭代,然后得到秘文分组。在每一轮的处理当中,我们都需要子密钥的参与,这个子密钥又来自于密钥编排方案,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zl5JguZ3-1687880439665)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)]
4.3 对称密码体制
4.3.1 DES算法
接下来我们来学习对称加密算法,我们以DES算法为例来进行讲解。
我们首先来看DES算法它的产生背景,美国商业部国家标准局 NBS于1973年5月和74年的8月两次发布通告,向社会征求密码算法,IBM公司研制的分组成绩密码体制loser应征成功。然后美国国家标准局 Nast于1977年将其作为非机要部门使用的数据加密标准,从而让DES算法成为了国际商用保密通信和计算机通信最常用的加密算法。这个算法后来由于安全性在2000年停用,代数算法它使用56位的密钥来加密64位的数据分组,但是算法它是适宜我们硬件实现的,它的处理速度会超过用软件实现的算法,但算法衍生出了可抗差分分c攻击的变形DES以及妙长度为128位比特的三重DES,但是算法在POS机、ATM、持卡智能卡、加油站、高速公路收费站等等领域被广泛的使用。比如我们这个信用卡持卡人的密码,实际上就通过DOS算法来加密的。IC卡和POS机之间的双向认证也使用代式、算法来进行加密。
DES算法有三个参数,分别是密钥,数据以及这个相应的算法,密钥它使用64位的密钥,8个字节,但是其中有效位是56位,它会把每个字节的最高位作为校验位给去掉,然后数据就是一个分组,代词算法它是8个字节的,64位作为1个分组,算法分为加密和解密,看是加密过程还是解密过程。
我们来看一下代数算法的原理。原理是将要加密的明文分组64位输入到算法当中,然后首先来执行一个初始的变换,初始变换就是一个置换,64位的明文分组顺序打乱,然后进入一个16轮的迭代变换,迭代变化完以后还要经过一个逆初次变换,最后生成这一个明文分组对应的密文。接下来我们首先接下来我们首先来看初始变换,这个初始变化就是对我们输入的64位明文分组,然后把它做一个置换操作,怎么样来置换?首先可以考虑把这个64位的分组分成8个字节,每个字节每个字节的。要进行置换的话,我们首先把这个明文分组分成8个字节,然后按照一个字节一个字节把它排成一个取证,首先来做一个矩阵的转次操作,也就是说把第一行然后转换到最后一列,接下来再把第二行也就是第二个字节转换到第倒数的第二列,然后反复这样操作完成这个转次。然后接下来在同一个字节内,也就是转换之后的统一列当中还要做一个置换,再把这一列当中的这个二进制再来转换这个顺序,把它们打乱,最后就完成了我们这个置换操作。这里是我们这个初始置换的一个原理图,我们可以看到初始置换把明文分组8个字节,然后每1个字节当中的每一位都把它置换到了密文分组当中的8个字节当中去,把它分散。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lQgFV1e-1687880439665)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg)]
看完了初始变化,我们再来看逆初始变换,16轮的迭代完了之后会经过逆趋势变换,逆初始变换跟我们初始变换正好是这个反过来的,它再把它还原。这个是逆出式变换示意图,这个初始变换和逆初始变换正好是一个相反的操作,我们把这个初始变换和逆初始变换看作是一个矩阵的操作的话,这两个操作它会得到一个什么?呀如果我们把这个初始变换和逆初始变换看作是一个对矩阵的操作的话,我们把这两个操作作为一个乘法,我们会还原出一个单位举证,也就是说这两个操作的结果完全是可逆的。为什么要做初始变化和逆初始变化?它本身不影响算法的安全性,只是为了使这个算法更加难以理解。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqXxrXyd-1687880439666)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)]
4.3.2 DES算法的迭代过程
接下来我们来看DES算法的迭代过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syYcNYUR-1687880439666)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg)]
大家看这张图,我们要加密的64位分组,经过前面的初始变换之后,我们把它平分成左右两个32位,这个右边32位,我们拿来跟这一轮子庙一起作为输入,输入到f函数当中进行处理。处理后的结果在于左边32位做一个易货运算,然后易货的结果作为我们下一轮迭代的右边上下位,如此的迭代要重复16次。
首先这里我们分别来看一下f函数内部的几个处理过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Uu8IkV5-1687880439666)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg)]
首先是一个扩展置换,它将输入的右边32位扩展成48位,它如何来进行扩展?它将输入的32位分成了8个4位的分组,然后在每个4位分组的前后分别插入1位,在每个分组的前面插上它的前一位在每个分组的后面插上,它的后一位,比如我们看第3个分组,9大12位,在第9位的前面插入前面的第8位,第12位插入它后面的第13位,这样的话,每一个4位的分组前后都插入2位,就插入了16位,所以就把32位变成了48位。扩展置换完之后,就要与我们这一轮子母进行混合,与这个密钥混合之后的明文再经过一个压缩代换,这个压缩代换就是把刚才的48位又压缩成32位,具体怎么样来压缩?首先把这个输入的48位分成了8个6位的比特串,然后每6位输入到1个s盒当中,然后进行1个压缩代换。我们可以看一下下面的s1s2,每个s核它实质上都是一个4×16的矩阵,也就是说它有4行16列,然后每一行都是015的数字,只是每一行它的顺序有所不同。我们通过下图来说明一下s盒的具体工作过程。每个s盒输入6位二进制,输出4位二进制,输入的6位二进制会把它分成2个部分,所谓两位二进制用来选择s和的行,中间的4位二进制用来选择s和的列,所谓两位二进制正好表达范围是03,然后正好可以选择s和的4行,然后中间的4位二进制表达范围就是015,正好可以选择s和的015列。
S-box是DES算法最敏感的部分,它的设计原理至今是没有公开的。人们担心隐藏陷门,但并没找到弱点。美国国家安全局透露了几条设计的准则,1.不是输入的线性反射函数,线性的函数就容易对它进行一个预测去逼近。2.改变s和输入的一位输出至少要改变两位,最大程度上面增大这个扩散量。3.任意一位输入保持不变时,输出0和1的个数之差极小,既如果保持一位不变而改变其余的5位,输出的0和1的个数不应该相差太多。 f函数当中的压缩代换完成之后,f函数当中的压缩代换完成之后,还需要经过一个342位的置换,然后才输出f函数。这个置换也是比较简单的,就是把我们刚才得到的32位的输出再把它再做一次打乱,让它更加的复杂。这里是它的示意图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjCjpdZs-1687880439667)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg)]
4.3.3 DES子密钥的产生
算法讲完了,我们接下来介绍DES算法的密钥编排方案。算法的子密钥如何来产生?我们刚刚看到算法会经过16轮的迭代,每一轮迭代都会使用一个48位的字母,经过16轮迭代,就需要16个指标,那这16个指标如何来产生?下面这张图就是我们16个指标的产生过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8kiDa15-1687880439667)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg)]
首先txt算法是64位8个字节,但是算法它的密钥是64位的,总共8个字节,他先会把这8个字节作为1个置换选择,首先把8个字节当中的每1个字节最高位去掉,然后把剩余的56位做一个置换,把顺序给它打乱,然后再把它平分成左右的28位左右,28位都来做一个循环移位,循环左移,然后循环左移后的左右,28位再把它组合起来,然后再经过一个置换选择,二从56位当中选出48位出来,作为一轮的怎么样?然后再进一步的进行循环左移,然后又来做置换,选择产生下一轮怎么样?如此反复16次产生16个指标,循环左移的位数并不是每一轮循环位次都是一样的,这里有个表格,其中有些轮次它循环左移移位,而大部分的轮次我们可以看到它循环左移两位,这就是16个字母的产生过程。首先我们可以看一下这个置换选择一,首先他把每个字节的最高位给去掉,然后6,然后剩余的56位再来把顺序打乱,做一个置换,然后评分成左右的28位。这个是我们这个置换选择的一个效果图,上面这一行最高位把它去掉,上面这一行每个字节的最高位把它去掉,然后剩余的来进行置换。然后这个是置换选择二,他会把这个左右28位组合起来的56位的,第9位、18位、22位、25 3453843、5456等等这些位去掉,然后剩余的48位就作为子密钥。这里是我们刚才的密钥的分割选择,循环移位以及压缩过程。这个压缩过程就是我们刚才讲的置换选择二,它是从56位当中选择48位出来,实际上就起到一个压缩的效果,把56位的压成了48位。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkTqioFb-1687880439668)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg)]
这张图是DES算法完整的一轮迭代的情况,既包括我们对明文分组的一轮处理,也包括我们这一轮所使用的字母的产生过程,大家下来可以结合我们前面介绍的来进行学习,大家可以结合我们前面的讲解,在这里来做一个完整的回顾试点一下。
算法是公开的,所以大家在网络当中可以找到不同语言版本开发的暂时算法,当然大家也可以,然后去调用一些函数库的接口去实现加减密。
我们再来看DES解密算法,DES算法的解密过程跟我们加密过程是完全类似的,它只是将这个16轮的字母按照逆序来使用,首先使用k16,然后k15反过来。
接下来我们看一下DES算法存在的问题与挑战,但是算法问世以来受到了很多的攻击,如果采用强力攻击的方式,也就是暴力破解的话,需要2的55次方是尝试,因为它的密钥的有效位是56位,然后密钥空间就是2的56次方,平均就需要2的55次方次尝试。如果采用这个差分密码分析法的话,可以大大的提高这个效率,需要2的47次方式尝试,如果采用线性密码分析法的话,又可以进一步提高,又可以进一步提高这个效率,大概2的43次方次尝试就可以完成。如果采用线性密码分析法的话,大概需要2的43次方次尝试,但是算法由于它的有效密钥长度是56位,随着计算机计算性能的提升,逐渐变得不安全,所以后来又产生了多重DES的IDEA算法。首先我们看二重DES,二重DES就是使用两个密钥,总共长度112位,然后加密的时候首先用第一个密钥k一来加密,然后再用k二再来加密,加密两次产生最终的密文,然后解密的时候就反过来用k二来解密,然后再完了之后再用k一再来解密。当然这个二重s要注意防止中途攻击,如果有中途攻击的话,也就是说在两次加密的中间获得了中间加密的结果,那这个时候实际上就把二重DES把它拆分成了两个易充袋式,这个时候它的安全性和一重DES是一样的。后来还有三重DES,同样使用两个密钥,但是它在加减密的时候把加密预算解密预算混在一起,进行了三次操作,加密的时候,它首先用k一密钥对明文进行一个加密算,然后接下来再用k二密钥然后做一个解密运算,然后再接下来再用k又来做一个加密。解密就是反过来先用k一来解密,然后再用k二又来加密一次,然后再用k一再来解密。后来又提出了这个IDEA算法,它是1992年瑞士的两个科学家他们提出来的,这个算法它使用了128位的密钥,它会经过8轮的一个迭代,它比较的快速,软硬件都可以实现。
4.4分组密码的加密模式
接下来我们来介绍分组密码的加密模式。我们刚才看到DOS算法,它的加密过程是对一个分组来进行加密,而实际往往要加密的数据不止一个分组,这个就涉及到了大数加密问题,这个大数加密问题要保持各个分组内容的完整,还要保持各个分组它的次序不变。根据加密分组之间的关联方式,可以分为5种加密模式。
第一种加密模式叫做电子代码本模式,它是最简单的分组加密模式,它是将要加密的分组,依次独立来加密,然后产生独立的密文分组,各个分组之间的加密过程互不影响。如下图所示,我们要加密的明文分组有若干个,每一个都用相同的密钥相同的算法来独立的加密产生独立的密文。解密过程也是一样的,每个密文分组独立来解密。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OEfHulY-1687880439669)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg)]
这种加密模式它的优点是最简单,而且它是利于并行的,因为各个分组的加减密过程它是互不影响的,所以可以变形的进行。另外它的误差是不传送的,也就是说我们在加密或解密过程当中,一个分组的加减密过程,如果产生了问题的话,它是不影响其他分组的加减密过程的,它适合传输长度短的豹纹。它的缺点是不隐藏明文的模式,相同的明文由于采用的密钥是相同的,所以会产生相同的密文分组,另外它是可以被主动攻击的。密文的内容如果遭到了剪切替换,不容易被发现,为什么?因为刚才说了它的优点是误差不会传送,所以其中的部分分组遭到了破坏,遭到了攻击,其他的分组不受影响,所以就不容易被发现。所以这个既是它的优点,也是它的缺点。由于它可被主动攻击,所以我们通常用它来传递长度比较短的豹纹。这里我们通过一个事例来说明一下电子代码本为什么不能很好的隐藏数据的模式。这里假设我们要加密的数据是这样一张图片,一个白色的背景,然后做着一只黑白的企鹅。我们可以看到这个要加密的明文,大部分的数据是相同的,白色的背景,这些区域数据是相同的,我们如果采用电子代码本来进行加密的话,我们可以产生中间这一幅图片,大家看到了什么?大家依然可以看到原图当中这个企鹅的轮廓为什么会这样?因为电子代码本相同的明文用相同的密钥来加密,会产生相同的密文块。所谓大部分白色的背景,它们的明文是相同的,就产生了相同的密文,所以就可以看出这个图片当中原来的轮廓大概是什么样的。如果我们针对这样一个要加密的明文图片,我们采用其他的加密模式的话,就可以完全的把原来明文当中的模式给隐藏起来,看起来是一片模糊的,如果我们采用其他的加密模式,我们就可以把明文当中的模式给隐藏起来,从而在加密后的密文图片当中什么都看不出来。
电子代码本ECB模式还容易受到分组重放攻击。这里我们看一个事例,假设一个银行a要向b的账号k打钱,这个时候它生成如下这个豹纹,总共有8个分段,包括转账的时间,ab的名称以及账号k还有就是金额。然后a银行准备好这个分组之后,就采用它的密钥,采用这个分组,a银行准备好这个转账消息之后,就用它的密钥,采用电子代码本的模式对这个消息进行加密。由于采用电子代码本,这个消息当中的时间、ab包括账号还有金额,他们各自的密文是互不影响的。假设在这个传输过程当中存在一个窃贼c他截获了我们这个报文,他要想往自己的账号c当中去打钱,他怎么办?它就可以把这个账号k替换为他自己的账号c然后再把这个报文重新发送给银行b就可以实现往他的账号c里面去打钱了。这个攻击关键的一步是什么?是我们这个窃贼c他需要得到他账号c的密文,用这个账号c的密文去替换账号k这个 C如何得到他的账号c的密文,因为 c是不知道银行的密钥的,而这个加密是银行完成了加密。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvAuK9Si-1687880439669)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg)]
接下来我们来看一下密码块链模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpQSHSCu-1687880439670)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg)]
密码块链模式我们要加密的明文第一个分组先于一个初始向量IV进行一个e或运算,然后再来进行加密,后续的分组先要与我们前一个密文分组来进行抑或再加密,那这样的话每一个分组的加密结果均会受到前面分组的内容的影响。通过这种方式就把分组进行了串联。这种加密模式它的优点是什么?首先它可以隐藏明文模式,由于他把明文分组之间的加密关联串联起来了,所以即便是相同的明文分组,由于它抑或了前面分组加密后的结果也会产生不同的密文分组。另外这种模式它不容易受到主动攻击,安全性好于我们前面的ecb模式,然后由于不容易受到然后由于不容易受到主动攻击,所以它适合传输我们长度比较长的报文是我们这个 SSl和IPSec的标准。有优点也有缺点,缺点就是它不利于这个并行的传输和处理,因为它必须要等到前面的分组加密完了,然后才能够加密下面的分组,然后它的误差是传递的,这个也是不容易受到主动攻击的原因,所以这个既是它的缺点,也是它的优点,因为它的分组之间是相互影响的,一个分组产生了错误,就会连带其他分组都产生错误。另外它需要有一个初始的向量IV接下来我们看密文反馈模式,这种模式它首先加密初始向量,然后这个加密的结果与明文分组进行易货,然后再把前一个密文分组作为输入向量加密。统一说一下。
接下来我们介绍密文反馈模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ez6n2ff-1687880439671)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg)]
这种模式它加密初始向量,然后加密后的结果与第一个明文分组进行异或前一个密文分组会作为初始向量,然后输入加密算法进行加密,加密后的结果,然后再与当前的明文分组进行异或,通过这种方式来把这个各个分组串联起来,它的优点也是可以隐藏明文的模式,然后还有就是它可以把分组密码转化为流密码,为什么?因为它对明文的处理是一个亿或运算,抑或运算抑或操作就可以一味一味的进行处理。原来是一个分组一个分组处理,现在通过易货运算把它可以转换成一味一味的处理,这个正好就是留密码的加密方式。另外它可以及时的加密传送小于分组的数据,就是说这个要加密的数据,即便它是小于一个分组的也没有关系,因为它的核心操作是易货运算对吧?然后另外它也是有缺点的,它的缺点也是不利于并行,因为它把明文分组之间的加密全部串联起来了,然后也是误差传送的,当然这个既是优点也是缺点,跟我们前面一样。然后另外它也需要有一个初始的向量。
我们再来看输出反馈模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYkiy7z3-1687880439671)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg)]
这种模式首先也是对初始向量进行加密,然后加密后的结果与明文进行一个易或运算,产生密文分组,然后前一个加密的结果作为当前分组加密的输入向量,前一个加密的结果与当前的明文分组进行易货运算,产生密文分组。这个优缺点跟我们刚才的模式也是比较类似的,我们这里就不再细讲了。大家可以看一下这个示意图,这种模式由于它的核心操作,也就是说对我们明文的处理是一个易货运算,所以这个加密模式跟我们刚才加密模式一样,它只需要加密算法,也就是说加密的时候使用加密算法,解密的时候也用相同的算法来进行解密,因为它的核心就是一个易货,再易货一次就可以了,就可以把它还原了。
我们再来看计数器模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziQGdOEx-1687880439671)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg)]
这个计数器模式事先会准备一个计数器,这个计数器按照一来递增,我们加密的时候可以批量的把这些递增的计数器来进行加密,完了之后加密的结果与明文进行一个议会运算,得到密文,这种模式适合对实时性和速度要求比较高的场合,它的优点就是对我们计数器加密,它不依赖于明文或者密文,这个计数器的加密我们事先可以加密,先把这些加密的结果准备好,它的分组是独立加密的,每一个分组都对应了一个计数器的加密结果,就可以并行的加减密。由于这种加密模式,它对明文的操作也是一个异或运算,所以这种模式也是只需要加密算法,它可以把这个分组转换成流模式,可以传送小于分组的数据,它的缺点是可以主动攻击,密文的内容如果遭到剪切替换也是不容易被发现的,因为使用的是计数器计数器的值是可以猜测出来的,它是按依赖递增的,所以就可以进行主动攻击,它的误差是可以传递的。
4.5 公钥密码体制
4.5.1公开密码体制思想
我们前面介绍对称密码体制以及对称密码的加密模式,接下来我们来看公开密码体制。公开密码体制是如何提出的?首先我们前面讲的对称密码体制,它的密钥管理很困难,通信的双方需要一对密钥,发送方用这个密钥来加密,接收方就要用这个密钥来解密。如果我们有n个用户需要两两来进行保密通信的话,这个时候所需要的密钥数量就是一个组合数CN2,等于n乘上n-1÷2。当用户的数量增大的时候,这个密钥数量会急剧的增大,比如假设n等于100的时候,CN2是等于4995,当这个用户的数量增大到了5000,这个时候这个密钥数量就变成了假设这个用户数量增大到了5000,这个时候这个密钥数量就可以高达1200多万个。另外除了这个双方需要密钥之外,密钥还存在一个分配的问题。我们前面看这个保密通信的模型,在双方进行保密通信之前,需要有一个安全的信道来传递密钥。
另外对称加密算法还没办法实现这个抗抵赖的需求,由于这个通信双方都掌握了密钥,那这个时候双方都可以进行抵赖。首先这个发送方它发送一个加密信息,它可以抵赖,发送过这个信息,没有产生过这个信息,因为这个密钥接收方手里面也有,接收方也是可以产生这个信息的,同时接收方也可以进行抵赖。另外对称加密算法是没有办法实现抗抵赖的需求的,因为通信的双方都掌握了密钥,这个时候发送方产生一个密文之后,它可以声称我没有产生过这个密文,它可以抵赖,因为这个密钥不光它有,接收方也有,另外接收方也可以用这个密钥产生一个消息,然后声称这个消息来自于某一个发送方,因为对方手里面也有这个密钥,所以我们对称加密是没有办法实现这个抗抵赖的,也就是说我们对称加密算法没有办法实现一个数字签名的问题,通过数字签名我们就可以实现抗体了。
我们再来看公开密码体制是如何提出的。1976年斯坦福大学的狄斐和黑俄曼两个科学家在密码学发展新动向译文当中,首次提出了公开密码体制的思想,这个公开密码体制的思想提出要解决加密的问题,同时还要解决密钥分配的问题以及数字签名的问题,正好对应了我们对称密码算法的三个痛点。
我们前面讲的对称密码体制,每两个用户之间进行保密通信都需要一对密钥,这个是它的示意图,这一对密钥在使用之前需要进行保密的传输,当用户数量多了之后,会造成这个系统当中有庞大的密钥数量。
我们对称密码体制的密钥管理很复杂,需要大量的密钥,还需要事先进行安全的传输,而公开密码体制,它的思想类似于我们生活当中信箱的思想,我们一家一户都会安装一个信箱,通过邮政系统,邮递员把这个信息把信件投递到信箱当中,然后这个信箱就可以起到一个保密的效果,其他人都没有办法从现象当中去读取信件,只有我们自己可以打开信箱,取出信件进行阅读。这里有一个示意图,假设a要跟b通行,这个时候 a就可以把这个信息投到 b的这个信箱里面,同时c也可以跟我们b通信把信息投到b的信箱里面,这个时候b只需要把这个信箱打开,就可以分别读取到a和c的这个保密信息
我们进一步来看一下信箱是如何工作的,信箱通常上面会有一个小的开口用于投放信息,下面会有个小门,上了锁用钥匙可以把它打开,上面这个开口往里面投入信息,投入信件就好比是一个加密过程,信息和信件投放进去之后,其他人就没有办法去读取它,实现了保密。下面那个我们用钥匙把门打开之后就可以取出信息,就好比是一个解密过程,所以信箱就可以用来加减密。这个时候我们把信箱做一个小小的改动,我们在上面这个开口也给它增加一道门,然后也设置一把钥匙,但是这把钥匙我们把它公开出来,大家都可以来使用。通过这个改造之后,信箱的作用没有改变,只是稍稍麻烦一点,要我们信箱里面投入信息,先要用公开的钥匙去把上面这个开口打开,它同样可以实现信息的保密和信息的解密。借鉴这样的思路,我们公开密码体制的思想就跟这个信箱的原理是一样的,我们为每一个用户设置两把钥匙,也就是两个密钥,其中一个密钥公开出来供大家使用,另外一个密钥就把它保密起来,自己来使用。公开出来的密钥主要用来加密,而保密的妙用来解密。这个事例当中有a、b两个用户,b用户有两把钥匙,两个密钥一个公开出来,一个自己保密,假设这个时候a用户要向b用户发送一条加密的消息的话,这个时候a用户就可以把b用户公开的这个密钥拿过来加密这个消息,然后发送给b用户。我们b用户收到这个加密后的密文消息之后,再用他自己手里的保密的密钥把这个消息进行解密,这就是我们公钥密码体制的思想。
公钥密码体制就是这样的,每个用户拥有一对密钥,这个密钥可以是自己产生,也可以委托第三方来产生。这样一对密钥其中一个用来作为加密密钥,加密密钥就把它公开出来,公开出来又叫做公钥。另外一个妙就是解密密钥,这个解密密钥必须要把它保密,让我们用户私有,公司要它是相互决定的,但是不能相互的推导,也就是说公开的密钥你不能这个公司要是相互决定的,但是不能相互推导,也就是说攻击者你拿到了公钥,你是不能推导出我的私钥的。
另外还需要两个算法,加密算法和解密算法,这两个算法都是公开的,因为密钥保密就可以了。加密算法就是用公钥,然后对消息做一个运算,得到密文,而简约算法就是用私钥对加密后的密文做一个解密预算,得到明文,这个加减密密钥,嗯嗯嗯,用户手里的这一对密钥,其中的任何一个都可以拿来做加密使用。这个时候另外一个密钥就作为解密来使用,反过来也是一样的,使用公钥密码体制,我们可以发现系统当中的密钥数量会大大的减少,因为我们每一个用户只有一对密钥,也就是说每个用户有两个密钥,当系统当中如果有n个用户的话,那这个时候总的密钥数量是二n个,这个数量是比我们刚才看到对称密码体制这个组合数c n二要小的多,特别是在密钥,特别是在用户的数量比较大的情况下面。
4.5.2公开密码体制的加密和鉴别
我们看完了公开密码体制之后,我们来介绍公开密码体制的加密和鉴别。首先我们来看一下如何用公开密码体制来实现加密。
用公开密码体制来加密的时候,首先发送方去获取接收方他的公开密钥,然后用这个公开密钥加密它的明文,得到密文之后把它传输给接收方,我们接收方收到密文之后,用他自己保密的私钥来对这个密文进行解密,就还原了明文。实际上往往这个发送方他会事先去收集其他用户的公开密钥,形成一个密钥环,然后在具体加密的时候再按需去取相应的接收方它的功药。
我们再来看用公钥密码体制如何来实现鉴别,也就是实现数字签名。这个实现鉴别和签名是对称密码体制没办法提供的功能,如何来实现签名?大家可以首先设想一下我们现实生活当中的签名,我们可以用笔手写一个签名,我们也可以拿手指站上印泥,按一个戳产生指纹,作为签名,这个签名实际上就是用我们每个个体所独有的东西产生的一个印记。我们再来看公样,我们再来看公开密码体制,每个用户有一对密钥,这对密钥是每个用户所独有的,但是这一对密钥当中的公钥是公开的,公开也就是说我的庙三三可以知道,李四也可以知道,王五也可以知道,这个大家都知道的东西自然就不能作为我们签名的一个依据。但是我们还有一个秘钥,私钥是掌握在我们每个人自己手里面的,这个私钥是每个人所独有的,它就可以作为我们这个私钥是每个人所独有的,掌握在自己手里面的,他就可以作为我们鉴别和签名的依据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KN5pRkX5-1687880439672)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg)]
如何用私钥来产生签名和进行鉴别,它是一个密钥,密钥的作用主要就是来对信息做变换,所以我们用私钥来签名,就是把这个私钥拿出来对信息做一个解密运算,得到的这个密文就是签名,我们把它表示为sig,代表signature,这个签名要能够验证,这个用私钥产生的签名如何来验证,私钥是对信息做了解密运算,我们要验证的话,我们就可以用公钥来对这个签名做一个加密算,因为公司要正好是一对可逆的,然后这个加密解密也也是一对可逆的过程,如果我们能够用公钥对签名做这个加密算,把这个原来的明文信息还原出来,这个时候就验证了这个签名的有效性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKOX0gGB-1687880439672)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg)]
接下来来看用公钥来实现鉴别和签名的过程。当一个用户要产生一个签名,并且把它发送给接收方来进行验证的时候,首先用户用他自己的私钥对这个要签名的信息做一个解密运算,产生的密文把它发送给验证方,验证方就去取这个用户他自己公开出来的公钥,然后用这个公钥去对这个签名信息做一个加密运算,然后如果能够把这个信息的明文给还原出来,就可以通过这个签名验证。
用公钥密码体制,既可以实现保密,又可以实现这个鉴别,这两个过程可以合二为一,放到一个通信过程当中来实现。这个时候通信方首先产生这个信息,然后首先来对这个信息做一个签名预算,用他自己的私钥对这个信息做一个解密预算,产生了签名后的信息,然后再来解决保密的问题,把这个签名后的信息用这个接收方它的公钥来加密传送给接收方。接收方收到这个加密后的信息之后,它首先要来进行解密,它就用他自己的私钥把这个信息解密出来,完了之后解密出来的是经过签名后的信息,他再来去验证这个签名,然后用这个什么呀用这个签名方他的公钥来对这个签名做一个加密预算,然后把这个签名的原始信息给还原出来,就验证了这个签名。
4.5.3公钥密码体制的安全基础与起源
公钥密码体制的安全性主要基于数学当中的困难问题,
最流行的有两大类,一类是大整数的因子分解,也就是给一个大的整数,要求把它做因子分解,把它拆分成若干个因子的层级,这样的问题没有快速有效的办法的,只能用很小的数去不断去尝试去整除这个数,看能不能除尽。比如我们这里举个例子,我们给出一个数27729,这是一个5位数,这个数实际上并不大,我们只是为了方便举例,实际应用当中的大整数通常要达到100位甚至200位甚至更多位数的10进制数。要分解27729这样一个数的话,由于它是一个基数,不能被偶数证出,所以我们从三开始,然后用递增的基数去除它,看一看能不能把这个数除尽。我们去做尝试,直到749,我们发现第一个能够把它整除的数,对应的也就是说这个数它的第一个因子是749,对应的三是351,是它的另外一个因子,所以分解一个大整数,我们往往需要很多次的尝试,非常的困难,开销很大。反过来我们要计算749×351,得到这个27729是很容易的。也就是说类似这样的问题,它是一个单向函数,我们给出几个数要计算它的成绩很容易,但是反过来给一个大的整数,要把它分解成几个因子?反过来给出一个大整数,要把它分解为若干个因子的乘积,它是一个困难问题,没有有效的办法。
基于大整数因子分解的公钥密码算法,主要有RSA体质和Rabin体质。
另外一类数学的困难问题就是离散对数问题,比如ElGamal体制、椭圆曲线密码体制是基于离散对数问题的。
我们来看一下公钥密码体制的起源。
这里我们来看一下首先斯坦福的三少侠,这是当年斯坦福大学的三位青年科学家狄菲黑欧曼和这个门口,这个前两位提出了公钥密码体制的思想和这个背包公钥密码算法,这个迈克提出了一个迈克的难题以及一些这个密钥分发的机制。其中狄斐和黑欧曼两位科学家凭借他们的公钥密码体制的思想,获得了2016年的图灵奖。接下来我们看MIT的三剑客,三少侠三剑客是我们国内的学者,对这些前辈先驱起的一些具有武侠色彩的称谓。MIT的三剑客他们提出了RSA的公钥、密码算法,这个算法前面我们介绍了基于大整数的因子分解问题,分别这个算法分别是用这三位科学家他们名字的首字母来命名,MIT的三剑客也获得了2002年的图灵奖。
4.5.4公钥密码算法的设计思想,
公钥密码算法涉及到了发送方、接收方和攻击者,涉及到数据,包括公钥、私钥、明文和密文。公钥算法的条件是产生一对密钥是可行的,因为我们公钥密码算法需要有一对密钥,一个用来加密,一个用来解密,产生这一对密钥在计算上面要可行,要进行加减密,所以我们要用公钥来加密计算它是可行的,同时用私钥来进行解密运算也是可行的。对于攻击者而言,公钥是公开的攻击者是可以获取公钥的,这个时候就要求攻击者用公钥去推断私钥这个在计算上面不可行。另外我们这个公钥和这个密文攻击者他是都是可以获得的,密文可以通过截获攻击来获取,攻击者掌握了公钥和密文,他要把这个明文恢复出来,在计算上是不可行的。还有加密和解密,它的顺序是可以交换的,这个是可可选的。
设计公钥密码函数的关键是陷门单项函数。首先我们来看一下单向函数。函数f从a到b也就是说一个函数实现从a集合到b集合的映射,如果这样一个函数满足下面的两个条件,我们就可以把这个函数称为单向函数。第一对所有的x属于a集合,我们易于计算fx就很容易把这个函数的值fx计算出来。第二是反过来,对几乎所有的x属于a要计算,要由fx去计算x是极为困难的。也就是说反过来计算,从fx去计算x是非常困难的,至于实际上是不可能做到的,这样的函数就是单向函数。这里易于计算它的解释是什么?就是函数值能够在其输入长度的多项式时间之内求出的,就 是容易计算的。什么是多项式?我想大家都应该很熟悉。多项式我想大家应该都很清楚形容下面这样一种形式,它是由多项的和构成,然后其中每一项它有一个系数,然后后面是我们这个未知数x的一个幂运算,这个多项式我们是很容易通过各种方法,通过手工的或者通过计算机很容易把它计算出来的。如果反过来,我们把这个 X跟它的指数交换一下位置,把这个 x交换到指数的位置的话,这样的表达式它就不是多项式了,它的计算时间开销是非常大的,这样的计算就是不可能做到的。
我们再来看限门单项函数,单向函数它求逆是很困难的,只能从一个方向上面,我们刚才看到的从a集合到b集合,这样的映射很容易计算出来,但是反过来在实际上几乎不可能,用单向函数来构造加减密算法是不可行的,因为你只能实现加密,解密的话没办法实现,因为它是单向的,所以用单项函数是不行的。所以我们就要使用这个陷门单项函数,就是这个单项函数它反过来计算很困难,但是如果掌握一个陷门的话,它求逆就很容易。在不知道限门的时候,我们求你很困难,但是一旦掌握了这个限门信息,求逆就很容易实现。这个单向陷门函数需要满足下面一些条件。首先限门单项函数是这样一种形式,y等于fx其中有一个k是密钥,这个就对应加密运算,我们就是要用密钥k去加密x然后得到密文y这个是容易计算的。反过来破译的话,在掌握了刚才的加密密钥k以及我们密文y的情况下,来破解是困难的,是不可行的。但是如果我们知道这个线门k一撇,然后我们在k撇的基础上面我们来求逆,求这个f的-1,就它的反函数,然后从这个密文y把x给计算出来,是容易的。这个就对应了解密过程。这三个分别对于加密破解和解密,这就是限门单向函数。
4.5.5 RSA算法
接下来我们来看一下它的设计思想。我们来看一下主要的公钥密码算法,RSA算法它的设计思想。
我们前面已经提到了,RSA是由MIT三位年青数学家R.L.Rivest,A.Shamir和L.Adleman三位提出的,需求是有两个算法,一个加密,一个解密,还需要两个密钥,一个公钥,一个私钥,他的基本思想就是公钥和私钥,他们是互为某种乘法的逆元。我们这里把它们表示为x公钥y私钥。加密就是用这个公钥去对密文,加密就是把明文作为一个公共钥匙的命运算。假设明文为m我们加密过程就是把m做x次幂运算得到密文c。我们解密就用四要来运算,怎么运算?同样做一个幂算,把密文c再做一个y次幂,再做一个次要次幂运算。由于这个 c是等于m的x次幂的,所以我们把这个代入就得到了m的 x米,由于x和y是互为乘法逆远,某种乘法逆远,逆圆就是这两个东西,它们的乘积等于一,所以 m的xy次幂就等于m的一次幂,也就等于m,也就是说我们这个解密算就实现了对明文的还原。这里这个公钥私钥xy互为某种乘法逆元,什么样的乘法逆元?反正不能是普通乘法的逆元,如果是普通乘法的逆元的话,我们已知公钥x我们就可以把y私钥给计算出来,对攻击者而言,它只要拿到我们公开的公钥,就可以得到推断出四要出来,这个公钥密码算法它就是不可行的,就是不安全的。
RSA设计的核心问题就是寻找一种运算,使我们x和y它是互为逆元的,但是又要保证从这个公钥x要把这个y推算出来是很困难的。设计思想是幂运算加上模运算,然后通过运算去利用数论当中大整数分解的困难问题。加密的过程就是在刚才运算的基础上,再叠加一个模运算,也就是把明文先做一个x次幂运算,得到结果再来做一个模运算,模除一个n然后得到密文,解密同样把密文作为一个私钥次命运算,然后再来模除n。带进去就得到了m的x和y次幂,然后结果再模除,最后把它还原。由于x和y它是互为逆元的,所以我们可以把它换原。这里问题来了,这个 x和y他们如何来互为逆元?他们设计的是这样互为逆元,x·y%φ(n)他们是等于一的,这个φ(n)算是Euler函数,这个欧拉函数或者说欧拉数范n它是小于且与n互数的正整数个数。我们前面在讲这个反射密码的时候,我们就遇到过犯n我们要计算这个这个 K一它的个数,这个时候我们要计算326,也就是说在246的范围之内,k一的取值的可能性。当时我们计算326它是等于12的,也就是说这个与也就是说小于26,并且与26户数的正整数个数是等于12的。
我们再来看一下其他的例子,我们这个再3再4再6,它们的值都是等于2的,也就是说小于三且与三互数的正整数个数与这个φ(4) φ(6)是相同的。我们具体可以看一下,比如说三,三的话小于它且与,它互数的正整数就是1和2,这两个数都是与它互数的,就除了这个一之外,没有其他正整数可以把它们俩同时这个整除。再来看4,小于四与它互数的正整数个数,正整数,我们再来看4小于4且与4互数的数是1和3,个数同样是两个。再来看6,小于6,其余它互数的数就是1和5,同样是两个,26就是我们前面看到的1357等等直到2325,这些都与他互诉。这里如果n它是一个素数的话,φ(n)=它就等于n减一,也就是说我们这个如果n是一个数数,我们就可以通过简单的后面这个公式把它的范n求出来,比如说57等等,这些都是素数,它的这个范欧拉数范恩就很容易计算了。5,φ(n)=就=5-1,就是47在7就=7-16。这个很容易理解,比如说我们要比如说五与五,比如说五小于五且与五互数的数就是1234,然后这个7的话也是一样的,小于七且与七互数的数就是1~6,因为这个素数的定义就是没有除了1之外,没有其他的数可以把它整除,所以只要是小于这个素数的数都可以跟它都跟它是互数的。另外如果一个数n它是由两个数的成绩构成,并且这两个数是素数,那这个时候它的欧拉数范围也是很容易计算的。比如说这个 n等于p乘上qp和q分别又各自都是素数,那这个时候范n就可以等于就可以很简单的等于(p-1)*(q-1)。比如说我们举例21,21是由3和7这两个数数的乘积构成的,这个时候我们就可以很简单的计算,这个φ(21)就等于3-1乘上这个67-1=12。
我们刚才看到RSA公钥和私钥他们是基于这个欧拉函数构造的乘法逆远。这里我们来看一下关于欧拉函数它的一些数论的知识。
有一个欧拉定理,若a和一个n它是互素的,这个时候这个a φ(n) ,然后再来模除一个n它的结果是等于一的。我们把这个欧拉定理做一个形变,我们把这个 a替换为我们要加密的信息,明文m这个欧拉定理就变成了m的负n次幂,然后再来模除n=1。我们再把这个等式的左右两边同乘上一个m就得到了m的范n次幂,就得到了m的犯n加一次幂,再来模除n等于m
我们前面看到的我们要做一个 RSA的解密算,实际上就是用密文做一个y次幂,做一个次要次幂再来模除,把它带入我们之前面的,这个这个我们进一步把这个 c密文它的这个形式带进去的话,我们就得到了m的xy次幂,然后再模除这个n等于n这里我把最后这两个等式标红,这两个红色的等式它们的右边都等于m所以这两个等式它的左边部分就是相等的,也就是说m的负n加一次幂模除n次等于m的xy致密磨穿的。基于这个等式的话,我们就可以构造 x和y的椭圆关系,也就是构造功要实要的逆额关系,就是x乘上y然后再来模除反应,它是等于1的。这个三等号跟双等号实际上一样的,也就是说它这个 x和y除上这个范n它的余数是等于1的,这叫做同于三等号是同于等号。这样一个等式实际上我们可以把它进一步推导成下面这样一个关系,也就是说x和y它的乘积是这个范n的若干倍,再加上一,所以它除上这个范它的余数是等于1的。
4.5.6 RSA算法的安全性。
RSA算法它的安全性在于密钥的安全性,其中这个密钥又分为公钥和私钥,公钥公开,用户可以拿到公钥,攻击者同样也可以通关通过,攻击者同样可以通过公开的渠道去获取公钥,所以 RSA算法它的安全性主要在于私钥的安全性,公私钥我们讲过它是互为逆缘的,可以我们能否通过公开的公钥去推导私钥?我们已知公钥是e和n我们要破解d我们要获取d如何下手?公钥私钥它没有如下的关系,就我们就是我们前面提到的他们是互为模除f(n)的乘法逆元,也就是异地的乘积,然后再来模除犯恩,他是等于一的,就是余除犯人他的余数是唯一的,攻击者他如果要从公钥一和n去计算我们这个 d或者说推到私钥地的话,它就需要去计算去求 f(n)。
求f(n)有两种方法,一种是分解法,分解法就是根据我们前面的RS密钥的产生过程,这个 n是等于p和q的,而这个 p和q是为数数,由于p和q是数数,所以范n就等于p-1乘上q-1。所以攻击者如果他想求这个犯n的话,他就需要获得这个 p和q然后通过p减一乘上q减一去得到这个翻,攻击者如何去得到这个 p和q因为密钥产生过程当中,p和q是被销毁了,但是n还在n是被作为公钥去公开的,所以攻击者他如果要求这个犯人的话,他只能从n入手,他就指望把这个 n分解成p乘上q这个实际上就是我们数学的分解大整数的问题,要把一个很大的整数n它分解成两个数数p和q的乘积。我们前面讲过这个是困难问题,这个当前是没有快速有效的办法去解决的,只能去花很长很长的时间,然后很多资源去不断的去尝试,这个在计算上面是不可行的。
第二种方法就是直接法。我们直接去求这个f(n),小于n且与n互素的正整数个数。把这个小圆且与它互数的正整数逐个的找出来,然后再来统计它们的个数。这里n是一个天文数字,有很大的两个数数p和q的乘积构成它更大的一个数,然后要去把它然后要去把与它互数的正整数逐个的找出来,这个难度等价于我们前面的分解法,把它分解出来,所以这两个途径去计算这个犯人在计算上面都是不可行的,所以通过我们公开的公钥去推断,推导私钥在计算上面是不可行的,所以 RSA算法它是安全的。
RSA算法它的安全性刚才看到基于大整数分解的困难性,这个 RSA-129,也就是它的这个呃数数字长度 RSA-129,也就是这个算法它的密钥长度是129位的嗯这个长度,历时8个月在是还是1个可以的嗯嗯。这个RSA-129就是妙长度是129位的RSA算法,历时8个月,在1996年4月被成功分解。同时这个呃 RSA-130也是在这个月被成功分解的,然后现在安全的密钥长度应该介于一百零,现在安全的IC妙长度应该介于1024bit到2048bit之间。
这里有一张图,是推荐的 RSA密钥长度,大家可以简单的看一下,二进制1024位大概的10进制长度就是308位,2048比特的密钥长度,实际长度就大概在616位10进制。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Oke1ovH-1687880439672)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg)]
我们再来看一下这个大数分解它的这个所需消耗的时间,这里有一张表,第一列是我们这个密钥的实际值位数,然后第二列就是对应的这个密钥它所需要进行因子分解的运算次数,然后最后一列就是所需要的计算时间,这里假设每每秒能够分解一次,我们可以看到如果密钥长度为50位的10进制的话,它需要1.4×10的10次方这么多次因子分解的运算次数,所需要的时间就大概在3.9小时。如果妙长度增长,比如说增长到100位,这个时候所需要的因子分解的运算次数是2.3×10的15次方,所需的时间就是74年,如果这个长度再进一步加大到500位,这个时候所需的时间就是4.2×10的25次方这么多年,这个在计算上面就是足够安全的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9psWVk9A-1687880439673)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg)]
接下来我们来简单分析一下RSA算法的优缺点。
首先看优点,RSA算法它的主要优点就是它的密钥管理相对简单,因为每一对因为每个用户他只有一对密钥,所以系统当中的总体的密钥数量是比较小的,然后公钥公开,私钥是保密的,这个时候密钥的分发就相对容易,公钥公开就不需要保密,就不需要安全的信道进行传输,而这个私钥保密用户自己把它收好就可以了,他不需要进行这个传输。另外就是RSA除了可以进行加密解密,还可以实现数字签名,用户的私钥是用户自己所独有的,我们就可以用私钥来实现这个签名预算。再来看它的缺点,RSA它的缺点一个是运算速度慢,它是基于这个大数计算的,公式要实际上都是很大的数字,它是在范恩公司要通常都是很大的数字,这个RSA最快也比这个带算法慢上100倍,一般只用于少量数据的加密。另外这个 RSA算法它的密钥产生非常的繁琐,我们刚才看到了这个它产生密钥的过程,首先他要选大数数,然后来做相应的计算,这个就受到了素数产生技术的限制,因为产生大数数是非常不容易的。
我们来看一下素数的产生,素数的产生没有直接快速的方法,通过素性检测来产生。随机产生一个很大的奇数,首先可以把偶数排除,因为偶数肯定不是素数,随机产生一个大的奇数,然后我们再来测试这个基数它是否是素数。从3开始用递增的序列去挨个的去除这个待检测的数字,例如是n,我们看一下有没有哪一个数能够把 n给整除?如果有一个数能够把这个 n整除了,说明这个数它不是一个素数,是合数,我们就可以把它排除,然后另外再产生一个大的奇数,再来按此方法来继续检测。
这里是我们将RSA与DES算法对比的一个性能比较。我们可以看到DES算法密钥长度是56位,就相当于同等强度RSA算法的384位密钥,112位的DES密钥长度强度就等同于RSA的1792位的密钥。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LiS7HYl-1687880439674)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg)]
这里我们再来把对称密码体制和非对称密码体制这两种体制优缺点进行对比。前面已经学习过,对称密码体制优点是计算开销小,算法简单,密钥较短,加减密的速度比较快,然后缺陷就是规模往往是比较复杂的,然后在通信之前需要进行安全的密钥交换,然后另外就是它实现鉴别和签名是比较困难的。然后相对而言,非对称密码体制,也就是公钥,密码体制,它的优点就是我们刚才提到的密钥的数量少,密钥的发布和管理问题要简单一些,可以实现这个数字签名。它的缺点就是妙的尺寸长度比较大,加密解密的速度比较慢。结合这两种密码体制它的优缺点,在做这个密码体制的选择的时候,就有所考虑,通常我们使用对称密码体制来进行大量数据的加密,也就是我们日常通信当中的这个信息的加密,我们就可以采用对称密码算法,这个公开密码算法就可以用于少量数据的加密,比如说对对称密码体质它的密钥进行加密,就可以用公开密码算法来构建安全的信道,来进行这个对称密码体制密钥的安全传输。