A. 什么是非对称加密
非对称加密算法是一种密钥的保密方法。
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。
甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
B. 非对称加密算法
非对称加密算法是一种密钥的保密方法。
非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。
另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方;乙方再用甲方的公钥对甲方发送回来的数据进行验签。
甲方只能用其私钥解密由其公钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。
所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
C. 电子商务非对称加密的原理
电子商务非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。
甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
电子商务非对称加密的原理:
1.A要向B发送信息,A和B都要产生一对用于加密 非对称加密算法 和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
D. 签电子合同时电子签名是怎么保证安全的
简单来说,电子签名是利用哈希算法与加密算法实现的电子文件上直接签字、盖章的技术。为了保障签署后的电子文件具备法律有效性,使用电子签名签署后的电子文件还需要具备签署身份可识别、签署内容不可篡改的特性。
但是,通过上述技术名词解释并不能直观、易懂的说明电子签名的原理,以下是通过还原电子签名签署的过程简介电子签名是如何保证安全保密的:
场景:由于业务需要,你和我需要签署一份合作协议。为方便起见,你将拟好的电子版合同文本在线发送给我签署。
怎样确保合同只有我可查看且不被他人恶意窃取?我又怎样才能确定文件的发送人就是你呢?
关键点1:公钥私钥登场
为了满足电子合同内容保密性和发送人认证的要求,我们了解到非对称加密的加密方式。
非对称加密:具有唯一对应的一对秘钥,一个公钥一个私钥,公钥所有人可见,而私钥仅自己可见。
非对称加密具有这样的特性:用公钥加密的文件只能用私钥解密,而私钥加密的文件只能用公钥解密。
发送合同时,你将拟好的电子合同使用自己的私钥加密后发送;接收合同时,如果能够使用你的公钥解密,则说明这份文件就是你发送的。
但是,我怎么才能知道你的公钥呢?
关键点2:政府出了个CA来帮忙
我了解到,政府授权了一个权威机构叫CA,可以提供网络身份认证的服务。
CA (Certificate Authority) :全称证书管理机构,即数字证书的申请、签发及管理机关。其主要功能为: 产生密钥对、生成数字证书、分发密钥、密钥管理等。
数字证书:是由CA机构颁发的证明,它包含公钥、公钥拥有者名称、CA 的数字签名、有效期、授权中心名称、证书序列号等信息,可以通俗为理解个人或企业在“网络身份证”。
我向CA机构申请获取你的公钥,使用它对电子合同解密,解密成功则说明发送人就是你。文件发送人的身份确认了,那怎么保障电子合同传输过程中未被篡改呢?
关键点3:哈希兄弟出场
有技术人员推荐了哈希算法(摘要算法),可以证明电子合同传输过程中是否被篡改。
哈希算法:通过加密算法将文本内容生成为一段代码,即信息摘要,其主要特征是加密过程不需要密钥,经加密的数据无法被反向还原。也就是说,只有两份完全相同的合同经过相同的哈希算法才能得到相同的摘要。
发送合同时,你将电子合同原文和经哈希运算的摘要一起发送给我接收合同时,通过对合同原文进行同样的哈希运算得到新的摘要,对比两组摘要是否一致即可证明我接收的文件是否被篡改
但是,如果传输过程中文件原文与摘要同时被替换了怎么办?
关键点4:对称加密来帮忙
除了上述的哈希算法、非对称加密、CA,为确保合同由发送到接收满足三个要求,即:由你发送、只能发给我、不能被篡改,我们还需要应用新的加密方式:对称加密。
对称加密:采用单钥密码系统的加密方法,信息的加密和解密只能使用同一个密码。
发送文件时:
1、你通过哈希运算得到原文摘要并使用私钥对其加密,得到你的数字签名,再将数字签名和合同原文进行对称加密,得到密文A——对原文加密
2、再通过CA获得我的公钥,对上述步骤中对称加密的秘钥进行非对称加密,即我的“数字信封”——对秘钥加密
3、将密文A和我的数字信封一起发送给我
数字签名:用哈希算法提取出源文件的摘要并用发送人的私钥进行加密后的内容。
数字信封:用接收方的公钥加密对称秘钥”,这就叫“给乙的数字信封。
接收文件时:
1、我使用自己的私钥解密数字信封得到对称秘钥——能解开,说明是发给我的
2、再使用对称秘钥解密密文A,得到带有你的数字签名的原文
3、使用你的公钥解密你的数字签名,得到签名中的原文摘要——能解开,说明发送者是你
4、使用相同的摘要算法获取原文摘要并与解密签名中的摘要对比——摘要一致,则说明原文没有被篡改
除了文件内容不可篡改,精确记录签署时间固定合同生效期限也十分重要,网络环境中怎样怎么确保合同签署时间不可篡改呢?
关键点5:时间戳来证明
我又请教了专家,原来我们国家还有专门确定时间的法定授时中心,它可以在我们签署的文件上加盖“时间印迹”,即时间戳。
时间戳(time-stamp):书面签署文件的时间是由签署人自己写上,而数字时间戳则由第三方认证单位(DTS)添加,以DTS收到文件的时间为依据,更精准、更有公信力。
至此,我们签合同的时间精准记录、合同内容不可篡改、双方身份也真实有效,这下没问题了!但是,签署完的电子合同怎么存储呢?不管是哪一方签署,日后产生纠纷都难免对合同存储期间的安全性产生质疑。
关键点6:找个权威第三方来存证
听说有专门的第三方电子数据存证机构,可以保存已签署的电子合同数据,当用户双方对合同内容产生争议时可申请出具具有公信力的证明。
合同签署的最后一个问题:存储问题也解决了!但唯一不足之处就是:签署过程太麻烦!为保障电子合同有效性,我们用到了非对称加密、哈希运算、时间戳等技术,还要CA机构、公证处等机构协助;
怎样更简单快捷地签一份有效的电子合同呢?
关键点7:选择可靠的第三方电子合同平台
根据《电子签名法》规定,使用可靠的电子签名签署的电子合同具备与手写签字或盖章的纸质合同同等的法律效力。
根据《电子签名法》规定,符合下列条件的,视为可靠的电子签名:
1)电子签名制作数据用于电子签名时,属于电子签名人专有
2)签署时电子签名制作数据仅由电子签名人控制
3)签署后对电子签名的任何改动能够被发现
4)签署后对数据电文内容和形式的任何改动能够被发现
结合上述电子合同签署过程,我们可归纳总结有效的电子合同应关注以下几个核心点:内容保密性、内容防篡改、明确签订身份、明确签订时间。
同时,为保障电子合同作为书面形式的证据能力,合同签署全程还应当由权威第三方机构存储公证。
商务部在《电子合同在线订立流程规范》指出:“通过第三方(电子合同服务提供商)的电子合同订立系统中订立电子合同,才能保证其过程的公正性和结果的有效性”。
E. 电子合同中,对称加密、非对称加密、哈希算法、CA、时间戳、数字签名这些是什么,有什么用,你们知道吗
算法,因为只要你有足够的时间,完全可以用穷举法来进行试探,如果说一个加密算法是牢固的,一般就是指在现有的计算条件下,需要花费相当长的时间才能够穷举成功(比如100年)。一、主动攻击和被动攻击数据在传输过程中或者在日常的工作中,如果没有密码的保护,很容易造成文件的泄密,造成比较严重的后果。一般来说,攻击分为主动攻击和被动攻击。被动攻击指的是从传输信道上或者从磁盘介质上非法获取了信息,造成了信息的泄密。主动攻击则要严重的多,不但获取了信息,而且还有可能对信息进行删除,篡改,危害后果及其严重。 二、对称加密基于密钥的算法通常分为对称加密算法和非对称加密算法(公钥算法)。对成加密算法就是加密用的密钥和解密用的密钥是相等的。比如着名的恺撒密码,其加密原理就是所有的字母向后移动三位,那么3就是这个算法的密钥,向右循环移位就是加密的算法。那么解密的密钥也是3,解密算法就是向左循环移动3位。很显而易见的是,这种算法理解起来比较简单,容易实现,加密速度快,但是对称加密的安全性完全依赖于密钥,如果密钥丢失,那么整个加密就完全不起作用了。比较着名的对称加密算法就是DES,其分组长度位64位,实际的密钥长度为56位,还有8位的校验码。DES算法由于其密钥较短,随着计算机速度的不断提高,使其使用穷举法进行破解成为可能。三、非对称加密非对称加密算法的核心就是加密密钥不等于解密密钥,且无法从任意一个密钥推导出另一个密钥,这样就大大加强了信息保护的力度,而且基于密钥对的原理很容易的实现数字签名和电子信封。比较典型的非对称加密算法是RSA算法,它的数学原理是大素数的分解,密钥是成对出现的,一个为公钥,一个是私钥。公钥是公开的,可以用私钥去解公钥加密过的信息,也可以用公钥去解私钥加密过的信息。比如A向B发送信息,由于B的公钥是公开的,那么A用B的公钥对信息进行加密,发送出去,因为只有B有对应的私钥,所以信息只能为B所读取。牢固的RSA算法需要其密钥长度为1024位,加解密的速度比较慢是它的弱点。另外一种比较典型的非对称加密算法是ECC算法,基于的数学原理是椭圆曲线离散对数系统,这种算法的标准我国尚未确定,但是其只需要192 bit 就可以实现牢固的加密。所以,应该是优于RSA算法的。优越性:ECC > RSA > DES
F. 9 非对称加密
目前为止,本书中只讨论到对称加密。假设一个密码系统不只有一个密钥,而是有一对密钥,其中公钥可以自由地发布,而私钥由自己保管。其他人可以使用你的公钥来加密数据,这个信息只有你的私钥可以解密,这个被称为 公钥加密(public-key encryption)
很长一段时间,这都被认为是不可能的。然而从1970年开始,这一类型的算法开始出现。第一个广为流传的是MIT的三位密码学家:Ron Rivest,Adi Shamir 和Leonard Adleman提出的RSA。
公钥算法并不仅仅用来加密,实际上本书之前的部分已经提到过公钥算法而其不是直接用在加密上。有三个与公钥算法相关的主题
从表面来看,公钥加密好像可以淘汰之前提到的对称密钥算法。对于任何事情都可以使用公钥加密,也不需要对称密钥系统中的密钥交换过程。然而在实际的密码学系统中,可以看到到处都是混合的加密,公钥加密在其中起着重要作用,但是大部分的加解密以及认证工作还是基于对成密钥算法的。
目前来皮裤看最重要的原因是性能。与流密码(原生的流密码或者其他)算法相比,公钥加密机制实在是太慢了。RSA通常情况下需要2048位也就是256个字节。其加密需要0.29百万次循环,解密需要11.12百万次循环。而对称加密和解密只需要每字节约10次循环。这也意味着在对称密钥算法中,解密256位数据,只需要3000次循环,这个效率是非对称版本的4000次。而目前尘握猛的密码系统使得对称加密更快了,在AES-GCM硬件加速或者Salsa20/ChaCha20只需要2或者4次每字节,更大程度上提高了性能。
实际的密码系统中还有更多其他的问题。例如对于RSA来说,它不能加密任何比它大的信息,通常情况是小于或者等于4096位,比大部分的需求要小的多。当然最重要的问题依然是上述的速度的问题。
本节简单描述RSA背后的数学问题。其本身并不能产生安全加密机制。之后会看到在其上构造的密码指导OAEP。
为了产生一个key,需要挑选两个大素数p和q,这些数需要随机私密的挑选。将两者相乘的到N,这个是公开的。然后选择一个加密指数e,这个也是公开的。通常这个数是3或者65537.因为这些数的二进制形式中仅有很少量的1。计算指数会更有效。(N,e)是公钥,任何人都可以用公钥来加密消息M,得到密文C。
接下来的问题是解密,有一个解密指数d,可以将C转化会M。如果指导p和q,d很容易计算。可以使用d来解密消息:
RSA的安全性依赖于对于不知道d的人来说解密操作是不可能的,并且在只知道(N,e)的情况下d的计算是非常难的。
类似于很多密码系统,RSA依赖于特定数学问题的难度。给定密文C,和公钥(N,e),反推出明文M。这被称为RSA难题。
最直接的方法是将N分解为p*q。给定p和q,攻击者只需要重复密钥拥有者的过程来计算产生d即可。
幸运的是,没有一个算法可以在合理的时间内分解这么大的数。不幸的是,目前也无法证明该算法一定不存在。更加糟糕的是,有一个理论上的算法,被称为Shor's Algorithm,可以在量子计算机上在合理的时间内分解一个数。目前,量子计算机还离我们有些远,但是未来某天可能就会成为现实。到时候RSA就变得不再有效。
本节中仅仅提到了分解大数这个最直接的方式来攻击RSA。在接下来的部分可以看到一系列针对RSA的实际攻击,其主要依赖于一些具体的实现。
目前,没有已知的实际的攻破RSA的方法。但这不意味着使用RSA的系统没有被攻破过。和其他被攻破的系统一样,应用中有很多组成部分,一旦其中的某部分没有恰当的使用,就会使整个系统变得不可用。更多有关RSA实施的细节的,参考【Bon99】和【AV96】,本部分只提及一些有趣的部分。
Salt是一个用python写的供应系统。它有一个模块叫做 cypto ,它没有使用已有的密码学系统,而是实现了一个自己的,其中使用的RSA和AES由第三方库提供。
很长一段时间里,Salt使派桥用的公钥指数e是1,这也就意味着P e=P 1=P(mod N)。这也就意味着结果的密文就是明文。目前该问题已经被修复,这里只是为了提醒大家,不要实现自己的加密系统。Salt现在支持了SSH作为传输蹭,但是先前提到的DIY的RSA/AES系统依然存在,并且还是默认的传输层。
OAEP是Optimal asymmetric encryption padding的简称,是RSA填充的一种。它的结构类似于下图(文档中这个图有问题,下面是正确的图):
最终产生的需要被加密的数据是X||Y,是n位长,这个n是N的位数。它使用一个随机的块R它的长度是k,在这个标准中,k是一个定值。消息首先需要用0填充被扩充到n-k位。图中左边的长度为n-k位,右边的长度为k。随机块R和以0扩充的M,M||000...使用两个陷阱函数,G和H。陷阱函数都是从一个方向计算非常简单,但是逆转非常的难。世纪中通常为hash函数。
G的输入是k位,输出是n-k位,H的输入是n-k位,输出是k位。
然后结果的X和Y被连接在一起,然后由标准的RSA来进行加密产生密文。
解密的时候,要反过来操作。接收者收到X||Y,他们是指导k的,因为这个是协议里的定值。所以前n-k是X,后k位是Y。
想要得到M,M||000...,需要去计算
可以看出,对于一些H和G来说,需要所有的X和Y才能找到M。对于H和G有很多种基于Hash函数的选择。
绝大多数的公钥加密只能一次加密一小块,一般都远小于要发送的信息。另外这些算法还很慢,比对称加密要慢的多。通常非对称加密用来连接密码系统。
有了公钥密码和密钥交换,是密码学里面两个非常重要的部分,因为人们总是需要与其他人交换私密的信息。有了这两个技术就可以安全地和其他人交流。
目前为止讨论的加密都没有任何形式的身份认证。这也就意味着对消息进行加密和解密,并不能验证得到的消息确实是发送者发送的原本的消息。
没有身份认证的加密可以提供隐私性,但是如之前章节所言,没有身份认证,尽管攻击者不知道任何原文的信息,他任然可以修改加密的信息。接收这些消息会泄漏一些私密的信息,这也就意味着私密性不在。例如之前第7章提到的CBC的填充攻击。
综上所言,出了加密私密的信息之外,还需要对其进行身份认证。通常身份认证都是对消息增加一些额外的可计算的信息。类似于加密,身份认证也分为对称类型的和非对称类型的。对称类型的通常被称为消息认证(message authentication),非对称类型的通常被称为数字签名。
下一章先介绍一下另一个密码学中的重点:hash函数。hash在产生签名和消息认证等过程中都需要用到。
[Bon99] Dan Boneh. Twenty years of attacks on the RSA cryptosystem. Notices of the AMS , 46:203–213, 1999. URL: http://crypto.stanford.e/dabo/papers/RSA-survey.pdf .
[AV96] Ross Anderson and Serge Vaudenay. Minding your pʼs and qʼs. In In Advances in Cryptology - ASIACRYPT’96, LNCS 1163 , 26–35. Springer� Verlag, 1996. URL: http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf .
G. SSL协议的工作原理
TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
H. TLS杩囩▼锛图H 闱炲圭О锷犲瘑锛
TLS 镄勭洰镄勪究鏄瑙e喅鏁版嵁镄
涓銆丷ecord 璁板綍鍗忚 锛埚圭О锷犺В瀵嗭级
浜屻丠andShake 鎻℃坠锛屾尌镓
楠岃瘉阃氲鍙屾柟韬浠
浜ゆ崲锷犺В瀵嗙殑瀹夊叏濂椾欢
鍗忓晢锷犲瘑瑙e瘑鍙傛暟
褰扑竴涓猅LS浼氲瘽寤虹珛濂戒箣钖庯纴浼氢娇鐢ㄥ圭О锷犲瘑镄勫瘑阍ュ幓阃氢俊锛岄偅涔埚备綍瀹炵幇浜嫔厛灏嗗圭О锷犲瘑镄勫瘑阍ヤ紶阃掔粰TLS浼氲瘽镄勫彟涓鏂瑰憿銆傚埄鐢ㄧ殑灏辨槸闱炲圭О锷犲瘑銆傚垎瀵圭О锷犲瘑姣斿圭О锷犲瘑鎱㈡暟鍗冨嶏纴镓浠ュ彧鏄浣跨敤瀵圭О锷犲瘑浼犻掍箣钖庡姞瀵嗕娇鐢ㄧ殑瀵圭О锷犲瘑镄勫瘑阍ャ备箣钖庣殑锷犲瘑瀹夊叏镐ч潬镄勬槸瀵圭О锷犲瘑𨱒ヨВ鍐炽
闱炲圭О锷犲瘑鏄链変竴鎶婂叕阍ュ拰涓鎶婄侀挜锛屽叕阍ュ彲浠ュ叕寮锛岃岀侀挜涓嶈兘銆
鐢ㄥ叕阍ュ姞瀵嗘垚瀵嗘枃锛屽啀灏嗗瘑鏂囩敤绉侀挜瑙e瘑灏辫兘瀹炵幇锷犺В瀵呜繃绋嬨
钥岀敤绉侀挜锷犲瘑锛屽叕阍ヨВ瀵嗗氨鏄绛惧悕璁よ瘉杩囩▼銆
甯歌佺殑闱炲圭О锷犲瘑鏂瑰纺鍒嗕负涓ゅぇ绫
RSA 娌℃湁钖戝墠瀹夊叏镐э纴涔熷氨鏄闇瑕佹疮娆$殑瀵圭О锷犲瘑瀵嗛挜镄勪紶阃挜兘鏄锘轰簬 鍏阍ュ姞瀵嗭纴链嶅姟绔绉侀挜瑙e瘑銆傚傛灉链嶅姟绔镄勭侀挜涓㈠け浜嗭纴闾e嚑骞村墠镄勯氢俊鏁版嵁閮芥湁鍙鑳借瑙e瘑銆傛墍浠ヨ繖鏄鏋佸害涓嶅畨鍏ㄧ殑锛岀侀挜镄勫湴浣嶅お閲崭简锛屽傛灉姣忔$殑锷犺В瀵嗛兘鏄涓存椂鐢熸垚镄勫瘑镰佹潵瑙e喅瀹夊叏镐э纴镓崭笉浼氩圭侀挜镄勫畨鍏ㄦф湁濡傛ゅ己镄勪緷璧栥傚湪2013骞寸殑妫遍暅闂ㄤ簨浠朵腑锛屾煇涓狢A链烘瀯杩浜庣编锲芥敛搴滃帇锷涘悜鍏舵彁浜や简CA镄勭侀挜锛岃繖灏辨槸鍗佸垎鍗遍橹镄勚傚傛灉钖戝墠涓嶅畨鍏锛岄偅涔堜箣鍓嶅埄鐢ㄨCA绉侀挜閮戒细鍏ㄩ儴阆娈冦傛墍浠ヨ繖閲岃寸殑鏄镟村畨鍏ㄧ殑 DH绫婚潪瀵圭О锷犲瘑銆
涓嫔浘灏辨槸DH瀵嗛挜浜ゆ崲镄凾LS鎻℃坠杩囩▼
DH 瀵嗛挜浜ゆ崲鍗忚锛娈iffile-Hellman key Exchange锛岀亩绉 DH 鎴 DHE 銆傚畠鍙浠ヨ╁弻鏂瑰湪瀹屽叏娌℃湁瀵规柟浠讳綍棰勫厛淇℃伅镄勬浔浠朵笅阃氲繃涓涓涓嶅畨鍏ㄧ殑淇¢亾鍒涘缓涓涓瀵嗛挜銆
1銆佸㈡埛绔娴忚埚櫒闅忔満鐢熸垚涓涓鍊糁a锛岃$畻Pa(x,y) = Ra*Q(x,y), Q(x,y)涓哄叏涓栫晫鍏璁ょ殑镆愪釜妞鍦嗘洸绾跨畻娉旷殑锘虹偣銆傚皢Pa(x,y)鍙戦佽呖链嶅姟鍣ㄣ
2銆佹湇锷″櫒闅忔満鐢熸垚涓涓鍊糁b锛岃$畻 Pb(x,y) = Rb * Q(x,y)銆傚皢Pb(x,y)鍙戦佸埌瀹㈡埛绔娴忚埚櫒銆
3銆佸㈡埛绔璁$畻Sa(x,y) = Ra * Pb(x,y)锛屾湇锷″櫒璁$畻Sb(x,y)=Rb*Pa(x,y)
4銆佺畻娉曚缭璇佷简Sa=Sb=S, 鎻愬彇鍏朵腑镄凷镄刹钖戦噺浣滀负瀵嗛挜銆
涓轰简瑙e喅涓婅堪DH镄勯梾棰桡纴寮曞叆浜咵CC妞鍦嗘洸绾匡纴杩涜岃繘鍖栦负 ECDHE 绠楁硶锛岀О涓 Elliptic Curve Diffie-Hellman Key Exchange銆侲CC鍜孯SA 鍦288瀛楄妭镄勯暱搴︿笅锛岀牬瑙RSA闇瑕佺叜娌镐竴鍕烘按镄勮兘閲忥纴钥岀牬瑙g浉钖屼綅鏁扮殑ECC 灏遍渶瑕佺叜娌告暣涓鍦扮悆姘寸殑鑳介噺銆俣SA 涓轰简鎻愰珮瀹夊叏镐э纴鍙鑳介潬澧炲ぇ瀵嗛挜浣嶆暟銆傚按灏镄勬槸鐜板湪镄勮秴绠楄秺𨱒ヨ秺铡夊炽傞噺瀛愯$畻涓嬬灏旂畻娉曞彲8h鍐呰交𨱒剧牬瑙2048浣岖殑RSA銆俣SA鍙鑳藉啀澧炲ぇ瀵嗛挜浣嶆暟锛屼絾鏄鍐嶅炲ぇ浣嶆暟锛岀Щ锷ㄧ璁惧囧氨𨱍ㄤ简锛屼綘澧炲ぇ镄勫瘑阍ユ槸杩愯惀鍟呜佹敹鍙栨祦閲忚垂鐢ㄧ殑锛岃屼笖锷犺В瀵嗗お璐圭数銆
ECC 镄勬暟瀛﹀师鐞嗘槸妞鍦嗘洸绾垮拰绂绘暎瀵规暟銆傛き鍦嗘洸绾垮緢澶嶆潅銆备负浜嗘彁鍗囨ц兘锛岃缮闇瑕侀夋嫨涓涓妞鍦嗘洸绾匡纴浣嗘槸瀹冧笉鏄鐪熸g殑妞鍦嗗舰锛屼笅闱㈡湁锲惧彲浠ョ湅鍒帮纴鍙鏄杩愮畻涓婄敤鍒颁简妞鍦嗙畻娉曘
浣嗘槸ECC涔熸湁寰埚氶梾棰桡纴1銆丒CC 鍙鑳芥湁钖庨棬锛屽侼SA锛堢编锲藉浗瀹跺畨鍏ㄥ眬鍙戝竷镄勪竴濂楃畻娉曪级锛岃繖涓绠楁硶灏辨槸琚镐鐤戣妞嶅叆钖庨棬浜嗐2銆佽屼笖ECC寰埚氱殑绠楁硶閮借娉ㄥ唽涓揿埄浜嗭纴涓涓嶅皬蹇冨氨瑕佸悆瀹桦徃锛屽叾涓揿埄澶ч儴鍒嗛兘琚榛戣帗娉ㄥ唽銆
ECC 妞鍦嗘洸绾跨殑瀹氢箟
ECC 镄勭畻娉曞师鐞呜繃浜庡嶆潅锛岃繖閲岃〃绀烘垜涔熺湅涓嶆哕銆傜偣鍒颁负姝㈠惂銆傦纸浠ュ悗鐪嬫哕浜嗗啀𨱒ヨˉ鍏咃级
杩欓噷镄勬姄鍖呯粨鏋滃氨鏄鐢ㄧ殑EC DH E 绠楁硶𨱒ヨ繘琛屽瘑阍ヤ氦鎹㈢殑銆傝繖閲岄夋嫨镄勬洸绾挎槸 secp256r1, 鍦ㄨ繖涓镟茬嚎涓锛屽熀镣瑰拰鍙傛暟宸茬粡缁椤嚭浜嗭纴PubKey 涔熺粰鍑轰简銆
鍦 TLS1.3 涓锛屼竴鑸浣跨敤镄 X25519 镟茬嚎 锛堣挋鍝ラ┈鍒╂洸绾匡级
I. 图文彻底搞懂非对称加密(公钥密钥)
前文详细讲解了对称加密及算法原理。那么是不是对称加密就万无一失了呢?对称加密有一个天然的缺点,就是加密方和解密方都要持有同样的密钥。你可以能会提出疑问:既然要加、解密,当然双方都要持有密钥,这有什么问题呢?别急,我们继续往下看。
我们先看一个例子,小明和小红要进行通信,但是不想被其他人知道通信的内容,所以双方决定采用对称加密的方式。他们做了下面的事情:
1、双方商定了加密和解密的算法
2、双方确定密钥
3、通信过程中采用这个密钥进行加密和解密
这是不是一个看似完美的方案?但其中有一个步骤存在漏洞!
问题出在步骤2:双方确定密钥!
你肯定会问,双方不确定密钥,后面的加、解密怎么做?
问题在于确定下来的密钥如何让双方都知道。密钥在传递过程中也是可能被盗取的!这里引出了一个经典问题:密钥配送问题。
小明和小红在商定密钥的过程中肯定会多次沟通密钥是什么。即使单方一次确定下来,也要发给对方。加密是为了保证信息传输的安全,但密钥本身也是信息,密钥的传输安全又该如何保证呢?难不成还要为密钥的传输再做一次加密?这样不就陷入了死循环?
你是不是在想,密钥即使被盗取,不还有加密算法保证信息安全吗?如果你真的有这个想法,那么赶紧复习一下上一篇文章讲的杜绝隐蔽式安全性。任何算法最终都会被破译,所以不能依赖算法的复杂度来保证安全。
小明和小红现在左右为难,想加密就要给对方发密钥,但发密钥又不能保证密钥的安全。他们应该怎么办呢?
有如下几种解决密钥配送问题的方案:
非对称加密也称为公钥密码。我更愿意用非对称加密这种叫法。因为可以体现出加密和解密使用不同的密钥。
对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用来对信息加密。私钥由信息接受方保留,用来解密。既然公钥是公开的,就不存在保密问题。也就是说非对称加密完全不存在密钥配送问题!你看,是不是完美解决了密钥配送问题?
回到刚才的例子,小明和下红经过研究发现非对称加密能解决他们通信的安全问题,于是做了下面的事情:
1、小明确定了自己的私钥 mPrivateKey,公钥 mPublicKey。自己保留私钥,将公钥mPublicKey发给了小红
2、小红确定了自己的私钥 hPrivateKey,公钥 hPublicKey。自己保留私钥,将公钥 hPublicKey 发给了小明
3、小明发送信息 “周六早10点soho T1楼下见”,并且用小红的公钥 hPublicKey 进行加密。
4、小红收到信息后用自己的私钥 hPrivateKey 进行解密。然后回复 “收到,不要迟到” 并用小明的公钥mPublicKey加密。
5、小明收到信息后用自己的私钥 mPrivateKey 进行解密。读取信息后心里暗想:还提醒我不迟到?每次迟到的都是你吧?
以上过程是一次完整的request和response。通过这个例子我们梳理出一次信息传输的非对称加、解密过程:
1、消息接收方准备好公钥和私钥
2、私钥接收方自己留存、公钥发布给消息发送方
3、消息发送方使用接收方公钥对消息进行加密
4、消息接收方用自己的私钥对消息解密
公钥只能用做数据加密。公钥加密的数据,只能用对应的私钥才能解密。这是非对称加密的核心概念。
下面我用一个更为形象的例子来帮助大家理解。
我有下图这样一个信箱。
由于我只想接收我期望与之通信的朋友信件。于是我在投递口加了一把锁,这把锁的钥匙(公钥)我可以复制n份,发给我想接受其信件的人。只有这些人可以用这把钥匙打开寄信口,把信件投入。
相信通过这个例子,可以帮助大家彻底理解公钥和私钥的概念。
RSA 是现在使用最为广泛的非对称加密算法,本节我们来简单介绍 RSA 加解密的过程。
RSA 加解密算法其实很简单:
密文=明文^E mod N
明文=密文^D mod N
RSA 算法并不会像对称加密一样,用玩魔方的方式来打乱原始信息。RSA 加、解密中使用了是同样的数 N。公钥是公开的,意味着 N 也是公开的。所以私钥也可以认为只是 D。
我们接下来看一看 N、E、D 是如何计算的。
1、求 N
首先需要准备两个很大质数 a 和 b。太小容易破解,太大计算成本太高。我们可以用 512 bit 的数字,安全性要求高的可以使用 1024,2048 bit。
N=a*b
2、求 L
L 只是生成密钥对过程中产生的数,并不参与加解密。L 是 (a-1) 和 (b-1) 的最小公倍数
3、求 E(公钥)
E 有两个限制:
1<E<
E和L的最大公约数为1
第一个条件限制了 E 的取值范围,第二个条件是为了保证有与 E 对应的解密时用到的 D。
4、求 D(私钥)
D 也有两个限制条件:
1<D<L
E*D mod L = 1
第二个条件确保密文解密时能够成功得到原来的明文。
由于原理涉及很多数学知识,这里就不展开细讲,我们只需要了解这个过程中用到这几个数字及公式。这是理解RSA 安全性的基础。
由于 N 在公钥中是公开的,那么只需要破解 D,就可以解密得到明文。
在实际使用场景中,质数 a,b 一般至少1024 bit,那么 N 的长度在 2048 bit 以上。D 的长度和 N 接近。以现在计算机的算力,暴力破解 D 是非常困难的。
公钥是公开的,也就是说 E 和 N 是公开的,那么是否可以通过 E 和 N 推断出 D 呢?
E*D mod L = 1
想要推算出 D 就需要先推算出 L。L 是 (a-1) 和 (b-1) 的最小公倍数。想知道 L 就需要知道质数 a 和 b。破解者并不知道这两个质数,想要破解也只能通过暴力破解。这和直接破解 D 的难度是一样的。
等等,N 是公开的,而 N = a*b。那么是否可以对 N 进行质因数分解求得 a 和 b 呢?好在人类还未发现高效进行质因数分解的方法,因此可以认为做质因数分解非常困难。
但是一旦某一天发现了快速做质因数分解的算法,那么 RSA 就不再安全
我们可以看出大质数 a 和 b 在 RSA 算法中的重要性。保证 a 和 b 的安全也就确保了 RSA 算法的安全性。a 和 b 是通过伪随机生成器生成的。一旦伪随机数生成器的算法有问题,导致随机性很差或者可以被推断出来。那么 RSA 的安全性将被彻底破坏。
中间人攻击指的是在通信双方的通道上,混入攻击者。他对接收方伪装成发送者,对放送放伪装成接收者。
他监听到双方发送公钥时,偷偷将消息篡改,发送自己的公钥给双方。然后自己则保存下来双方的公钥。
如此操作后,双方加密使用的都是攻击者的公钥,那么后面所有的通信,攻击者都可以在拦截后进行解密,并且篡改信息内容再用接收方公钥加密。而接收方拿到的将会是篡改后的信息。实际上,发送和接收方都是在和中间人通信。
要防范中间人,我们需要使用公钥证书。这部分内容在下一篇文章里会做介绍。
和对称加密相比较,非对称加密有如下特点:
1、非对称加密解决了密码配送问题
2、非对称加密的处理速度只有对称加密的几百分之一。不适合对很长的消息做加密。
3、1024 bit 的 RSA不应该在被新的应用使用。至少要 2048 bit 的 RSA。
RSA 解决了密码配送问题,但是效率更低。所以有些时候,根据需求可能会配合使用对称和非对称加密,形成混合密码系统,各取所长。
最后提醒大家,RSA 还可以用于签名,但要注意是私钥签名,公钥验签。发信方用自己的私钥签名,收信方用对方公钥验签。关于签名,后面的文章会再详细讲解。