公钥密码
密钥配送问题#
- 密钥配送问题
在对称密码中,由于加密和解密的密钥是相同的,因此必须向接受者配送密钥。
要使用对称密码进行解密,就必须使用和加密时相同的密钥才行,也就是只有同时将密钥也发送给Bob,Bob才能够完成解密,但是如果将密钥一同发送,窃听者Eve截获后也能够完成解密。因此,如果将密文和密钥同时发送时,则加密无效。
解决配送问题的方法有:通过事先共享密钥、密钥分配中心、Diffie-Hellman、公钥密码四种方法来解决。 - 通过事先共享密钥
在传输信息之前通过安全的方式将密钥交给对方,但是有一定的局限性(仅限于少数人之间),一旦人数过多,所需要的密钥量会很庞大。 - 通过密钥分配中心来解决
当所有人参与加密通信的人都需要事先共享密钥,则密钥的数量会变得巨大,在这样的情况下,使用密钥分配中心(KDC)来解决密钥配送问题。当需要进行加密通信时,密钥分配中心会生成一个通信密钥,每个人只需和密钥分配中心事先共享密钥。
使用密钥分配中心通信的过程:
1)Alice像密钥分配中心发出希望于Bob进行通信的请求
2)密钥分配中心通过伪随机数生成器生成一个会话密钥,这个密钥是提供Alice与Bob在本次通信中使用的临时密钥
3)密钥分配中心从数据库中取出Alice和Bob的密钥
4)密钥分配中心用Alice的密钥对话密钥进行加密,并发送给Alice
5)密钥分配中心用Bob的密钥对会话密钥进行加密,并发送给Bob
6)Alice对来自密钥分配中心的会话密钥(已使用Alice的密钥加密)进行解密,得到会话密钥。
7)Alice用会话密钥对邮件进行加密,并将邮件发送给Bob
8)Bob对来自密钥分配中心的会话密钥(已使用Bob的密钥加密)进行解密,得到会话密钥
9)Bob用会话密钥对来自Alice的密文进行解密
10)Alice和Bob删除会话密钥
因为这种方法是中心化的,因此如果员工数量增加,密钥分配中心的负荷也会随之增加。如果分配中心的计算机被攻击,就会导致整个系统瘫痪甚至整个密钥库失效。 - 通过公钥密码来解决密钥配送问题
在公钥密码中,加密密钥和解密密钥是不同的。只要拥有公钥密码,任何人都可以进行加密,但没有解密密钥是无法解密的。因此只有拥有解密密钥的人才能够进行解密 - 什么是公钥
公钥密码中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接受者用解密密钥对密文进行解密。其中加密密钥是发送者加密时使用的,而解密密钥则是接收者解密时使用的,而解密密钥则是接收者解密时使用的。公钥和私钥是一一对应的,一对公钥和私钥统称为密钥对(key pair)。 - 公钥通信的流程
1)Bob生成一个包含公钥和私钥的密钥对
私钥由Bob自行妥善保管
2)Bob将自己的公钥发送给Alice
Bob的公钥被窃听者Eve截获也没关系,将公钥发送给Alice,表示Bob请Alice用这个公钥对消息进行加密并发送给他
3)Alice用Bob的公钥对消息进行加密
加密后的消息只有用Bob的私钥才能够解密,虽然Alice拥有Bob的公钥,但用Bob的公钥是无法对密文进行解密的
4)Alice将密文发送给Bob
密文被窃听者Eve截获也没关系。Eve可能拥有Bob的公钥,但是用Bob的公钥是无法进行解密的
5)Bob用自己的私钥对密文进行解密
通信流程图:
- 术语
非对称密码等同于公钥密码
私钥别称有:个人密码、私有密码、非公开密钥、秘密密钥、私有秘密密钥
RSA#
- 什么是RSA
RSA是一种公钥密码算法。由三位开发者(Rivest Shamir Adleman)三位开发,并取其名字首字母命名 - RSA加密
在RSA中,明文、密钥和密文都是数字。
加密公式:密文 = 明文E mod N (RSA加密)
可以理解为明文和自己做E次乘法,然后将其结果处以N求余数,这个余数就是密文。因RSA的加密是求明文的E次方modN,所以只要知道E和N这两个数,任何人都可以完成加密的运算,所以E和N是RSA加密的密钥,组合起来也就是公钥。E和N合并在一起统称为公钥,因此表示时记作公钥(E,N)
-RSA解密
解密公式:明文 = 密文DmodN
可以理解为将密文和自己做D次乘法,再对其结果除以N求余数就能得到明文。解密时用到的数字N和加密时用的数字N是相同的。数D和数N组合起来就是RSA的解密密钥,因此D和N的组合就是私钥。只有同时知道D和N两个数的人才能够完成解密的运算。
- 生成密钥对
在整个过程中需要使用E、D、N三个数,其中E和N是公钥,D和N是私钥,因此求E、D和N这三个数就是生成密钥对。RSA密钥对的生成步骤如下:
1)求N
首先需要准备两个很大的质数p和q,其中p和q太晓得话,密码会很容易被破译,但太大计算时间又会变得很长,如果p和q的大小都是512比特,相当于155位十进制数字。要求出这样大的质数,需要通过为随机数生成器生成一个512比特大小的数,再判断这个数是不是质数。如果伪随机数生成器生成的数不是质数,则需要重新生成。
判断一个数是不是质数并不是看它能不能分解质因数,而是通过数学上的判断方法来完成(费马测试和米勒·拉宾测试)
2)求L(L是尽在生成密钥对的过程中使用的数)
L这个数载RSA的加密和解密过程中都不会出现,他只出现在生成密钥对的过程中。L是p-1和q-1的最小公倍数(lcm),如果lcm(X,Y)来表示"X和Y的最小公倍数",则L:L = lcm(p-1,q-1)(L是p-1和q-1的最小公倍数)
3)求E
E是一个比1大、比L小的数。此外,E和L的最大公约数(gcd)必须为1.如果用gcd(X,Y)来表示X和Y的最大公约数,则E和L之间存在关系:1 < E < L、gcd(E,L) = 1 (E和L的最大公约数为1,即互质)。而要加上E和L的最大公约数为1这个条件,是为了保证一定存在解密时需要使用的数D
4)求D
数D是由数E计算得到的,D、E和L之间必须具备条件:1 < D < L、E * D mod L = 1。只要数D满足上述条件,则通过E和N进行加密的密文,就可以通过D和N进行解密。条件的D,就需要保证E和L的最大公约数是1,也正是对E的要求条件。
对RSA的攻击#
破译者知道的消息:
密文:可以通过窃听来获取
数E和N:公钥是公开的信息,因此密码破译者知道E和N
破译者不知道的内容:
明文:需要破译的内容
数D:私钥中至少D是不知道的信息
其他:密码破译者不知道生成密钥对时所使用的p、q和L
-
通过密文来求得明文
公式中如果不加mod,知道E和N是能够很快推出明文的,因为就是一个求对数的问题。而加上mod N之后,就是求离散对数的问题 -
通过暴力破解来找出D
找出D,能够通过暴力破解法来撞出密码,但是破解的难度也会随着D的长度增加二变大,当D足够大时,就不能在现实时间内通过暴力找出数D。目前RSA中所使用的p和q的长度都是1024比特以上,N的长度为2048比特以上。由于E和D的长度可以和N差不多,因此要找出D,就需要进行2048比特以上的暴力破解,这是很难实现的。 -
通过E和N求出D
E和N都是由质数p和q推算出来的,质数p和q不被密码破译者知道,则无法通过此方法破译。也就是说将p和q交给密码破译者与吧私钥交给密码破译者是等价的。 -
对N进行质因子分解攻击
因为N是公开的,但是由于p和q都是质数就只能通过对N进行质因子分解才能获得,因此一旦发现了对大整数进行质因子分解的高效算法,RSA就能够被破译 -
通过推测p和q进行攻击
因为p和q都是根据伪随机数生成器生成,因此要选择可靠性高的伪随机数生成器,否则会被猜出破译 -
中间人攻击
中间人攻击不破译RSA,而是针对机密性的有效攻击。整个过程符合流程,但是就因为攻击者的截获,误传信息,导致两人通信失败。因此为避免这种情况加入了证书机制。
-
选择密文攻击
假设攻击者可以使用解密提示服务,发送任意数据,服务器都会将其当作密文来解密并返回解密的结果。因此通过RSA-OAEP在明文前面填充一些认证信息,如果解密时在数据的开头没找到正确的认证信息,就会返回错误信息,而不将错误内容返回。
其他公钥攻击#
- ElGamal方式
该方式利用了mod N下求离散对数的苦难度,但是有一个缺点,经过加密的密文长度会变为明文的两倍 - Rabin方式
Rabin方式利用了mod N下求平方根的困难度。因此破解Rabin等于破解RSA的质数因子难度。 - 椭圆曲线密码
椭圆曲线是通过将椭圆曲线上的特定点进行特殊的乘法运算的逆运算非常困难这一特性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】