垂直应用

信息安全(二)

密码学基本原理(上)






大家好,欢迎大家观看 STM32信息安全(二):密码学基本原理(上)——传输机密数据。




本期主要回顾加解密原理的第一部分,如何传输机密数据。我们会看到,对称加解密和非对称加解密技术在保证数据安全通信的过程中,发挥的不同作用,以及二者结合后如何解决了一个传输机密数据过程中的关键问题。实现这些思想和技术的典型算法,也会做简单介绍。





场景假设


我们假设有这样一个场景,关于Alice和Bob之间的爱情故事。大家可能会说,加解密技术这么高深又晦涩的主题,为啥以一个这么浪漫的场景开头。其实,历史上不乏有这样浪漫的密码科学学家。

Alice呢,喜欢Bob,Bob也喜欢Alice,但是双方都没有挑明。终于有一天,Alice鼓起勇气给Bob写了一封信,向他表白,说:我,喜欢你




有个女人叫Eve,可能她不喜欢Alice,或者Eve自己也喜欢Bob,总之她想破坏Alice向Bob’的表白行为。于是她拦截了这封信,把内容改了,改成“我不喜欢你”。Bob收到这封信,伤心欲绝远走他乡。这样,本来一个美好的爱情故事,就硬生生被扼杀在了萌芽之中。





在这样一个被轻易攻击了的通信过程中,我们思考,采取什么样的措施,可以使得Alice发给Bob的消息,第一,除了Bob,其他人看不到消息的内容;第二,即使有人破解了Alice的这份信,看到了内容;但是被篡改后的消息到达Bob之手后,他能很快判断出来这并不是Alice发来的原始信息。第三,Bob收到一封号称Alice发来的信,他可以判断这个消息是否真的是来自Alice。

答案是:密码学。密码学是一门科学,也是一门艺术,关于如何把消息进行变形,使得消息能安全的在通信双方之间交换,不易受到攻击。

它可以帮助我们实现信息安全的三大工具,保证机密性、提供完整性、对身份做认证。




这样,假使昨日再来,Alice和Bob也许能够有情人终成眷属。





两大加解密机制


为了保证数据的机密性,我们需要对消息进行加密。有两大类加解密方案,以AES为代表的对称加密算法,和以RSA、ECC椭圆曲线为代表的非对称加密算法。



加密和解密的过程,都需要密钥参与。只是对称加密技术中,加密和解密过程,使用相同的密钥;而非对称加密技术中,加密和解密,使用的是不同的密钥。




对称加解密技术

【对称加解密技术】,又加 【对称密钥技术】。通信双方,Alice和Bob事先约好了一个共同的密钥。Alice把表白信用该密钥加密后,发送给Bob,Bob拿到密文后,使用同样的密钥进行解密,得到明文。



过程简单明了,并且算法的运算也很快。


这种技术也有缺点。首先,Alice和Bob需要事先碰头,或者在一个安全的环境来约好这个密钥。通常对称加解密技术中采用的算法都是公开,保密的就是这个密钥。如果密码泄露,后面所有通信就不安全了。

另外,Alice和Bob通信要维护一个密钥,和Amanda通信又要维护一个密钥,和N个人通信就要维护N个密钥。这实在是一项繁琐、不好管理的工作。




非对称加解密技术

【非对称加解密技术】中,加密和解密过程,使用的是不同的密钥。每个主体无需提前和将要与之通信的另外一个主体,费尽心思构筑一个安全的环境来商讨通信密钥。




每个人事先自己产生一对自己的公钥和私钥。当然也是在安全的环境下,但是一个人要找一个安全的环境,比两个人,尤其是身处异地的两个人,构筑一个安全的商讨环境要容易得多。 这个私钥了是需要保密的,只有自己知道,就是图中的红色标识的钥匙;公钥呢,顾名思义是可以公开的,谁都可以拿到。Alice的公钥,Bob可以拿到,Eve也可以拿到,没有问题。 


Alice要给Bob发表白信,就使用Bob的公钥对这封信加密,然后发送给Bob。这封密文信件,是使用Bob的公钥加密产生的,那么只能由Bob的私钥才能解密。虽然Bob的公钥是公开的,除了Alice有,Eve也有,但是Eve拿着Bob的公钥是解不开由Bob的公钥加密的信件的。只有Bob手上有自己的私钥,那么只有他自己才能解开这封密信。这是和对称密钥技术最大的不同之处。因为我们不会去深入了解非对称密钥的数学原理,那么在应用层面,这里就需要当定理一样记住:公钥是用来加密的,私钥是用来解密的。你要和谁发消息,就用谁的公钥来对消息加密。


如果Alice用自己的私钥给表白信加密,那么这封密文,但凡有Alice公钥的人都可以解开。而公钥是公开给所有人的,不仅Bob能解密,Eve也可以解密出来。那么就根本谈不上加密了。


除了加解密应用,公私钥还可以运用在消息的签名和验签上,这个我们在后面的信息完整性部分再讲。但是规则是一样的,即签名过程,和验签过程,使用的密钥是不同的。


从以上的过程描述我们可知,Alice只需要维护好自己的那一对公丝密钥对,就可以和N个人安全的通信了。无需维护【对称密钥技术】里的N个密钥。

当然非对称加解密技术也有缺点,就是它运算复杂,效率不对前面的对称密钥技术。




共享秘钥的生成


在双方进行远程但是安全通信的应用中,对称密钥技术优点是运算快、效率高;非对称密钥技术是密钥易于管理和分发。



我们可以结合二者的优点。Alice自己想好一个通信密钥,使用Bob的公钥对其进行加密,然后发送给Bob。由于这是Bob的公钥加密的,只有Bob的私钥可以解开。那么Bob就可以安全的拿到这个Alice想好的通信密钥。非对称加解密技术虽然运行慢,但是只用于在通信最开始的传输共享密钥之用,那还是可以接受的。之后,Alice和Bob之间就可以利用对称加解密技术的“高效运算” 优势,使用这个约好的通信密钥来对后续的来往邮件进行加密、解密了。


就像我们平时的产品,上电初始化过程可以慢一点,后面的常规任务执行速度更快,响应够及时就可以了。




刚才是使用非对称密钥技术【传输】共享密钥。这个过程看起来不错,但是也有隐患。它不具有前向安全性。毕竟后续大量通信所依赖的对称密钥是曾经出现在了公开环境中,即使这个密钥是被加密过的。假使,攻击者把所有通信的密文都记录下来,然后有朝一日破解了Alice使用Bob公钥加密的这个通信密钥。那么这些来往的书信就会大白天下。虽然失去了时效性,但是对于很多应用,历史记录的曝光也是完全不能接受的。


聪明的密码学家又想出了另外一个好方法。共享密钥,即使是加密过的,也无需在公开的环境出现。双方可以使用一个安全的方法来【协商】出后续通信要使用的这个对称共享密钥。它的思路是通过交换一些公开信息,然后结合只有自己才知道的私密信息,各自就能计算出一个和对方计算结果相同的值,这个值将会作为后续通信的对称加解密密钥。大家想一想,什么样的运算可以达到这个效果?那就是:(g^x )^y=(g^y )^x




图中绿色的是公开信息,可以理解我公钥,在开发环境自由传递。红色是各自的私密信息,算是私钥。

通过使用公开的g,并公开交换g的x次方,和g的y次方。Alice除了自己的私密x,还拥有了公开信息g的y次方。由此可以计算出来g的y次方,再x次方。

同样,Bob除了自己的私密y,还拥有了公开信息g的x次方。由此计算出来g的x次方,再y次方。这两个值是相等的,就是协商出来的共享密钥。


这就是DH算法,它不是用来加解密的,是用来做密钥协商的。由于整个过程也是用到了各自的私密信息,和与之相关的公开信息,所以也是属于非对称加解密技术。




加密算法 · 模式



基于前面讲的原理,我们现在看一下加解密常用的算法。

对称加解密运算速度快,是因为它基于排列,组合,位移,异或等操作,因此软硬件实现起来都快。



现在常用的算法是AES,是在2001年从15个算法中历时4年的竞争中脱颖而出,被美国NIST,即美国国标与技术研究院选择来取代DES的。DES已经被攻破,安全性已经受到了明确的威胁,不建议大家继续使用。 


AES,明文块大小是128位,16字节,作用于4*4字节的二维矩阵。密钥大小有几种,我们的SBSFU安全包使用的是AES-128,即密钥长度也是128位,16字节。


AES有多种工作模式。最初的AES-ECB,电子密码本,对每个明文块独立加密,最大缺点是不能隐藏明文模式(比如图像加密轮廓仍在)

以CBC,cypher block chain,密码分组链接为代表的 链接模式, 破除了ECB模式下,明文独立加密造成的明文模式泄露,每个明文块加密时都需要前一个密文的参与。链式工作模式的一个缺点是,多个明文块不能并行的进行加密运算。第N个明文块要等待第N-1个加密运算的结果。

CTR,计数器模式,引入了一个自增算子,这个算子用密钥加密后的输出,和明文异或得到密文,相当于一次一密。它可以多个明文块并行加密,也避免了ECB电子密码本的明文块模式暴露的问题。


这一页绿色高亮出来的算法和模式,在我们后面介绍的安全包,SBSFU会用到的。请大家额外注意一下。




现在我们来看一下几种常见的AES工作模式的示意图,加深理解。



电子密码本,如图示,ECB:每个明文块独立加密,第 i 块密文只与第 i 块Ã÷ÎÄ相关;缺点刚才说了,ECB加密会泄露明文模式的信息。


密码分组链接方式,引入随机初始向量 IV

>> CBC模式,cipher-block chaining,每个明文块加密时都需要前一个密文的参与,所以最后一个明文块的加密结果有消息认证码MAC的味道。即前面任何一个明文修改后,需要重新加密。

>> OFB,output feedback,输出反馈模式。与ECB和CBC模式只能够加密块数据不同,OFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。使用块加密产生密钥流,再将密钥流与明文异或,得到密文。

>> CFB,cipher feedback,密文反馈 模式,使用块加密产生密钥流,与明文异或,得到密文。从示意图很容易看出,CFB与OFB模式的区别在于密钥流的产生,一个使用密钥流,一个使用输出结果


所谓“块加密” ,就是对明文使用算法,在密钥的参与下产生密文;流加密 ,是使用算法和密钥产生随机码流,然后与明文异或,产生密文 。

看明文参与的是加解密算法操作,还是异或操作。这张胶片里,ECB和CBC,黄色明文,都是和蓝色的加密算法框运算,因此是块加密;

OFB和CFB示意图中,黄色的明文,参与的是异或运算,因此是流加密。流加密设计为对速度要求高的场合。


流加密的解密与加密方式相同, 基于同样方式产生密钥流,与密文异或,得到明文


链式工作模式的一个缺点,从图中看得很清楚:多个明文块不能并行的进行加密运算。第N个明文块要等待第N-1个加密运算的结果。





CTR:计数器模式,使用块加密算法进行流加密。从图示中可以看到,明文参与的是异或运算。

由于每次的计数器值不同,则每次生成的密钥流不同。即使明文块相同,异或出来的密文也是不同的。CTR模式下,多个明文块的加密、解密,可以并行运行。


CCM是 “CBC-MAC计数器” 模式的简称,使用块加密算法进行流加密。刚才说了流加密,就是明文参与异或。在加密的同时产生消息认证码,保证消息完整性与认证性。

从图示可以看出,CCM由两部分组成,粉色框里就是上面的CTR,计数器加密模块;紫色框就是CBC,cipher block chain模式,对所有明文运算后会得到消息认证码。因为对所有明文的运算,有密钥参与,而密钥又有归属性,即有一个owner,那么这样的运算结果也是和某个持有这个密钥的owner绑定的,因此说具有“认证性”,运算的结果叫做认证码。

CCM三个字母,两个C分别是CBC和Counter的意思,M是Mac,消息认证码的意思。


GCM,是“伽罗华 计数器” 模式,使用块加密算法进行流加密。在加密的同时产生消息认证码,保证完整性和提供认证性。

和CCM类似,使用CTR计数器模式加密,在加密的同时,对每个密文块与密钥h在有限伽罗华域上做乘法,最后得到消息的MAC值,即消息验证码。




接下来,我们再看看非对称加密技术有哪些常用算法?


刚才提到过非对称加密效率比较低,不适用于涉及大量数据的通信加密。原因在于,它是基于大数的数学运算。大数,就是数值很大的数。举个例子,1000万,我们觉得挺大一个数了,它的2进制表示只有24位。而这里的大数,他的位数都是几百、上千位。是真正的“大”数。非对称加密就是基于这些大数的数学难题,由此可知,它的实现,无论是软件还是硬件,都比较复杂。所以不适用于大量数据的实时加解密。


非对称加解密算法,常用的有两种,RSA和ECC。RSA是发明这种算法的三个发明者的首字母缩写;ECC是椭圆曲线 elliptic curve的意思。


RSA基于的数学难题是“相乘与分解”:已知两个素数,它们的乘积容易计算;反之,知道乘积,推出两个乘法因子会比较困难。

例如61和349 ,它们的乘积很容易计算,61*349 = 21289;试想如果知道21289,如何知道是哪两个素数数相乘而得 ?


ECC基于的数学难题是“指数与对数”:设想2个整数:3和6, 容易计算36=729;但是反推很难,知道729,如何构造出底数和指数?


这里提醒大家一点:非对称加密算法里的密钥大小,暗含的意思和对称算法里的有点不一样;这里,非对称技术,要求的是“大”数,2048位的密钥,最高位一定是1,才能保证真正是一个“大”数。而对称技术,密钥大小主要是指:参与位移、异或等运算的位数。比如128位密钥它可以是若干个0开头。对称技术是基于位移,异或等运算,只要有128位的0/1序列参与运算即可。


RSA和ECC这两个非对称加解密技术,在相同强度下,即同一等级安全水平下,ECC密钥长度更小。但是算上AES的话,还是它的密钥长度最小。

如表格中NIST给出的数据:3072位的RSA密码强度,大约相当于256位ECC密码强度,大约相当于128位AES算法的强度。


性能来说,RSA签名比ECC慢,但是验签更快。因此适用于验签操作频度高,而签名操作频度低的场合,比如分布式系统中的访问控制。


ECDSA,签名和验签,开销相差不大,适用于签名和验签操作频度相当的场合,比如点对点通信的安全信道建立。




我们举一个例子来展示RSA密钥生成的过程。

首先选择两个素数P、Q,加上P=5,Q=11;计算P、Q的乘积N=55,作为模;这里模N的长度,就是密钥的长度。55的二进制表达是110111,因此只有6位。这是一个小数。我们举例就有小数来举例,原理是和大数一样的。然后计算 Ø,是P-1和Q-1的乘积,=40。选择任意整数E,在1和Ø之间,并且二者最大公约是1;我们选择E=7,是满足这个条件的。接着我们计算D,E,即7和D的乘积,被Ø,40取模,要等于1。得到D=23。OK,把N=55、E=7、D=23返回,可以构建RSA的公钥和私钥了。E叫做公钥指数,和N这个模,一起构成公钥。D叫做私钥指数,和模N,一起构成私钥。



公钥和私钥构造好了,怎么使用呢。对数字M加密,根据之前了解的,要使用公钥。就计算M的E次方,再对N取模。

对数字C解密,要使用私钥,就计算C的D次方,再对N取模。


现在大家可能就能明白,为啥RSA做验签比较快:因为做验签,用的是公钥;而RSA可以选用较小的公钥指数,比如3,5,17,257;而安全强度完全不变,因为和安全强度对应的模数N的长度,完全和公钥指数E的大小无关。




ECC椭圆曲线。这里n阶椭圆曲线是已知的,系数a、b已知,所选的曲线定了,系数就定了,线上的参考点也是已知。在1和阶数n-1之间,选择一个随机数k,作为私钥。从G这个点,在曲线上做点加或者点乘,最后得到P点=k个G点之和。G点就是作为椭圆曲线的公钥。具体的如何使用这个公钥,取决于不同的实现。通常会拿P点的某个坐标值参与对数和取模运算。



大家可以看到,椭圆曲线的私钥只是一个随机数, 计算量很小。这同时也说明了,随机数在椭圆曲线算法中的地位,如果随机数不随机,具有特定的形状,则私钥就没有安全可言。




DH算法,属于公钥私钥体系,但不是用来加解密的;是用作密码协商。之前讲密钥协商原理的时候,已经认识到它的数学基础是:(g^x )^y=(g^y )^x。�

现在看一下DH算法是如何使用这个数学原理的。


选择一个素数P,比如17,作为模。选择一个整数G,比如9;都是公开信息。各自想一个私有的素数,比如Alice的Xa=5,Bob的Xb=3;红色的都是私密信息。


首先各自以G为底数,做Xa和Xb的指数运算,然后对P取模。Alice和Bob分别获得了Ya=8,Yb=15。这两个数在公开的环境下发给对方。Alice拿到Yb=15后,以Yb为底数,运算它的Xa的方,在对P取模,得到结果是2。和Bob拿到Ya,和自己的私密信息Xb运算,再取模P后的结果相同。这样,一个共享的信息双方就协商出来了。




把ECC椭圆曲线和DH密钥协商算法,结合起来就是应用中最常用的ECDH算法。基于公开信息的同一条曲线和同一个参考点G;以及各自的私密信息Ka和Kb;在曲线上做两次点乘,最后得到相同的P点。



有人会说,P点是公钥,那最后双方岂不是把公钥给协商出来了,这怎么理解?其实,ECC只是协商过程中用到的算法;最后得到的双方都知道的,但是第三方不知道的这个东西P点,怎么用就无所谓了;比如可以把P点的坐标,拿来作为后续AES加密的公钥,诸如此类。


加解密原理中,如何传输机密数据的介绍 就到此结束。




本期回顾


回顾一下本期内容:



我们已经有了对消息进行加密的工具,我们使用非对称算法,RSA、ECC、DH来产生或者发送通信双方的共享密钥。然后使用对称算法,AES、TDES,和共享的秘钥,对数据加密。



接下去要解决的问题就是:完整性检查,如何确保没人篡改了消息,或者说即使篡改了,接收方能立刻识别出来。

欢迎大家继续关注下一期内容。谢谢观看




微信扫一扫