RSA算法原理及其在HTTPS中的应用
来源:互联网 发布:php curl 发送请求头 编辑:程序博客网 时间:2024/06/10 18:42
本文在阅读不少他人的优秀博文以及查阅HTTPS协议和RSA等相关资料的基础上整理而成,包含了RSA算法的详细原理及其在HTTPS中的应用。RSA作为HTTPS协议中最为核心的加密/解密算法,其原理却很简单,很容易理解。当你读完本文之后,你也会惊叹于RSA算法发明者的奇思妙想。
首先,RSA的密钥越长,就越难破解。目前被破解的最长RSA密钥是768位二进制。也就是说,长度超过768位的密钥,还无法破解(至少没有人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥及其安全。下面就让我们来认识RSA算法。
一、互质关系
如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。关于互质关系,有如下结论:
- 1、任意两个质数构成互质关系,如13和61;
- 2、一个数是质数,另一个数只要不是前者的倍数,则两者构成互质关系;
- 3、如果两个数之中,较大的那个数是质数,则两者构成互质关系,如97和57;
- 4、1和任意一个自然数都是互质关系,比如1和99;
- 5、p是大于1的整数,则p和p-1构成互质关系,如57和56;
- 6、p是大于1的奇数,则p和p-2构成互质关系,如17和15。
二、中国余数定理
原本RSA算法和中国余数定理没有什么直接的联系,但即将介绍的欧拉函数的证明需要用到中国余数定理,固在这里先行介绍一下。
中国余数定理:给出
从某种角度来说,中国余数定理几乎是显然的。让我们以两个比较小且互质的整数3和4来理解中国余数定理背后的直觉。其中
从表中可以看到,
三、欧拉函数
请思考以下问题:任意给定正整数
计算这个值的方法就叫做欧拉函数,以
第一种情况:
n=1 ,则φ(1) =1,因为1与任何数(包括自身)构成互质关系。第二种情况:
若
n 是质数,则φ(n)=n−1 。因质数与小于它的每一个数都构成互质关系。第三种情况
如果
n 是质数的某个次方,即n=pk (p 为质数,k 为大于等于1的整数),则φ(pk)=pk−pk−1 。这是因为只有当一个数的因子不包含质数p ,才能与n 互质。而因子包含质数p 的数一共有pk−1 个(1×p,2×p,…,pk−1×p ),把它们去除,剩下的就是与n 互质的数。
上面的式子还可以写成φ(pk)=pk(1−1p) 。可以看出,第二种情况是第三种情况中k=1 的特例。第四种情况
如果
n 可以分解成两个互质的整数之积,即n=p1⋅p2 ,则φ(n)=φ(p1⋅p2)=φ(p1)⋅φ(p2) ,比如φ(56)=φ(8×7)=φ(8)⋅φ(7)=4×6=24 。其实这条结论用“中国余数定理“就很好理解了。简单说下思路:如果
a 与p1 互质(a<p1 ),b 与p2 互质(b<p2 ),c 与p1p2 互质(c<p1p2 ),则c 与数对(a,b) 是一一对应关系。由于a 有φ(p1) 种可能,b 的值有φ(p2) 种可能,则数对(a,b) 有φ(p1)φ(p2) 种可能。而c 的值有φ(p1)φ(p2) 种可能,所以φ(n)=φ(p1⋅p2)=φ(p1)⋅φ(p2) 。补充说明:我们还可以证明一种更加特殊的情况:如果
n 可以分解为两个质数之积,即n=p1×p2 (p1 、p2 为质数),那么φ(n)=φ(p1⋅p2)=φ(p1)⋅φ(p2) 。证明这如下:证明:
∵p1 、p2 为质数,∴ 与p1⋅p2 不互质的数必然包含p1 或p2 。
包含p1 或p2 的数有:1×p1,2×p1,…,p2⋅p1,1×p2,2×p2,…,p1⋅p2 。
由第二种情况知,φ(p1)=p1−1 ,φ(p2)=p2−1 ,即φ(n)=φ(p1⋅p2)=φ(p1)⋅φ(p2) 。
证毕。第五种情况
因为任意一个大于1的正整数,都可以写成一系列质数的积:
n=pk11pk22…pkrr ,根据第四种情况,有φ(n)=φ(pk11)φ(pk22)…φ(pkrr) ,再根据情况三,有:φ(n)=pk11pk22…pkrr(1−1p1)(1−1p2)…(1−1pr) ,这就是欧拉函数的通用计算公式。
比如1323的欧拉函数:φ(1323)=φ(33×72)=1323×(1−13)(1−17) 。
四、欧拉定理
欧拉函数的用处,在于欧拉定理:如果两个正整数
也就是说
欧拉定理还有个特殊情况:
假设正整数
费马定理是欧拉定理的特例,而欧拉定理是RSA的核心。
在证明欧拉定理之前我们需要先介绍消去律。
消去律
如果gcd(p,q)=1 ,则a⋅pmodq=b⋅pmodq⇔amodq=bmodq 。
其中gcd(p,q) 函数表示求p 和q 的最大公约数。
消去律非常简单,这里就不再进一步证明了。下面就用消去律来证明欧拉定理。证明:
第一步,假设小于n 且和n 互质的数构成的集合为Zn ,则|Zn|=φ(n) 。再令Zn={x1,x2,…,xφ(n)} ,S={a∗x1modn,a∗x2modn,…,a∗xφ(n)modn} ,那么我们可以证明Zn=S ,理由如下:
首先,显然有|Zn|=|S| ;
然后,因为a 与n 互质,xi(1≤i≤φ(n)) 与n 互质,所以a∗xi 与n 互质,所以a∗ximodn∈Zn ;
最后,假设i≠j ,那么xi≠j ,且由a 和n 互质可得a∗xjmodn≠a∗xjmodn (消去律)。
第二步,由第一步的结论我们有如下推导:aφ(n)∗x1∗x2∗…∗xφ(n)modn ≡((a∗x1)∗(a∗x2)∗…∗(a∗xφ(n)))modn ≡(a∗x1modn)∗(a∗x2modn)∗…∗(a∗xφ(n)modn) ≡x1∗x2∗…∗xφ(n)modn
对比等式的左右两端,因为xi(1≤i≤φ(n)) 与n 互质,所以aφ(n)≡1modn (消去律)。
证毕。
五、模反元素
如果两个正整数
欧拉定理可以用于证明模反元素必然存在:
六、密钥生成步骤
第一步,随机选择两个不相等的质数
第二步,计算
第三步,计算
第四步,随机选择
第五步,计算
第六步,将
七、可靠性
回顾密钥的生成步骤,一共出现了六个数字:
ed≡1(modφ(n)) ,所以只有知道e 和φ(n) ,才能算出d ;φ(n)=(p−1)(q−1) ,所以只有知道p 和q ,才能算出φ(n) ;n=pq ,所以只有将n 因数分解,才能算出p 和q 。
结论:如果
八、加密和解密
1. 加密用公钥
(n,e) B 要向A 发送信息m ,他用A 的公钥(n,e) 对m 进行加密。这里需要注意的是,m 必须是正数(字符串可以取ascii值或Unicode值)且m 必须小于n 。所谓“加密”,就是算出下式中的c :me≡c(modn) 。A 的公钥是(3233,17) ,B 的m 假设是65,则6517≡2790(mod3233) ,即c=2790 。2. 解密用私钥
A 拿到2790 后,用(3233,2753) 进行解密,稍后我们将证明cd≡m(modn) 一定成立。
说明:对于m>n 时,有两种解决办法:一种是把长信息分割成若干短消息,每段分别加密;另一种是先选择一种“对称加密算法”,如DES,用这种算法对信息进行加密,再用RSA对DES加密。
九、私钥解密的证明
即证明
cd≡m(modn) 成立。证明:
∵me≡c(modn) ,∴c=me−kn ,则cd=(me−kn)d 。
则等价于要证明:med≡m(modn) 。
又∵ed=hφ(n)+1 ,∴med=mhφ(n)+1 。
即等价于证明:mhφ(n)+1≡m(modn) 。
分两种情况讨论:(1) 当m 和n 互质时,由欧拉定理:mφ(n)=1(modn) ,∴mhφ(n)+1=m⋅(mφ(n))h≡m(modn) 。(2) 当m 和n 不是互质关系时,由于n 为质数p 和q 的乘积,所以必然有m=kp 或者m=kq 。不妨假设m=kp ,其中1≤k<q (因为前面已经假定m<n ,所以1≤k<q ),则此时k ,q 必然互质(因为1≤k<q ,且q 为质数,则比q 小的任意正整数都与q 互质),由此可知,m 和q 必然互质。根据欧拉定理:mφ(q)=mq−1≡1(modq) ,
从而mhφ(n)=(mq−1)h(p−1)≡1(modq) ,于是存在正整数s ,使得mhφ(n)=1+sq 。此式两边分别乘以m=kp ,则mhφ(n)+1=m+skn ,从而cd=mhφ(n)+1≡m(modn) 。
证毕。
十、RSA运算相关的问题
- 问题一:如何处理大数运算?
- 问题二:如何求解同余方程
xy%n=1 ? - 问题三:如何快速进行模幂运算?
- 问题四:如何获取大质数?
实际上,在实现RSA算法的过程中发现,问题二、三、四不是各自独立的,而是互有关联。
问题一的解决思路:将大数表示为一个
问题二:有欧几里得、辗转相除法等。
问题三:模幂运算是RSA的核心算法,最直接地决定了RSA算法的性能。针对快速模幂运算这一课题,西方现代数学家提出了大量的解决方案,通常都是先将模幂运算转化为模乘运算。例如,求
由于
所以
而对于
到此,我们已经将模幂运算转换成了模乘运算的循环,那么要进一步提高RSA算法的效率,还需要提高模乘运算的效率。模乘过程中复杂度最高的环节是求模运算,因为一次除法实际上包含了多次加法、减法和乘法,如果在算法中尽量避免除法,则算法你效率会大大提高。著名的蒙哥马利算法是不含除法的模幂算法。
问题四:质数测试是RSA取密钥的第一步,但奇妙的是,其核心运算与加解密时所需的运算完全一致,即都是模幂运算。而模幂运算过程所需求解的欧几里得方程又恰恰是选取密钥第二步所需的运算。
十一、RSA在通信中的应用
RSA算法让双方可以在不安全的通信线路上进行秘密地通信,一切看上去似乎完美了。但在实际的应用中,我们还需要解决另外一个问题——中间人攻击:在A、B两人建立会话的过程中,攻击者很容易在线路中间操纵信息,让A、B两人误以为他们是在直接对话。让我们来看看这具体是如何操作的:
建立会话时,A首先呼叫B并索要B的公钥,此时,攻击者注意到了这个消息,当B将公钥传给A时,攻击者截断B的公钥,然后把攻击者自己的公钥传给A。接下来,A就给出了自己的密码,比如314159,然后用它收到的公钥进行加密,并将加密后的结果传给B。A以为他用的是B的公钥,但实际上他用的是攻击者的公钥。攻击者截获A传来的信息,用自己的私钥解出314159,再把314159用B的公钥加密后传给B。B收到信息后不会发现有什么异样,因为这段信息确实能用B的私钥解开,而且确实是314159(通过数据库匹配)。今后,A、B将会用314159作为密码进行通话,而完全不知道攻击者已掌握了密码。
怎么封住这个漏洞呢?我们得想办法建立一个获取对方公钥的可信渠道。一个简单而有效的办法是,建立一个所有人都信任的权威机构,由该机构来存储并分发大家的公钥。这就是我们通常所说的数字认证机构,英文是Certificate Authority,简称CA。任何人都可以申请把自己的公钥放到CA上去,不过CA必须亲自简称申请者是否符合资格。如果A想要和B建立会话,那A就直接从CA处获取B的公钥,这样就不用担心得到的是假公钥了。
新的问题又来了,怎么防止攻击者冒充CA呢?CA不但需要向A保证“这个公钥确实是B的”,还要向A证明,我确实是CA。
CA如何证明自己是CA呢?用“数字签名”。数字签名能够保证数据传输的完整性、发送者身份验证以及防止交易中的抵赖行为。
十二、数字签名及数字证书
这部分内容我本来打算自己写的,直到有一天我发现了一篇博文:一个故事教你看懂什么是数字证书,这篇博文用非常生动形象的例子解释了数字签名、数字证书以及HTTPS的工作原理,我这里如果再重复赘述就没有什么意义,想了解RSA算法在HTTPS中具体是如何应用的,强烈推荐这篇博文。
十三、相关链接
- RSA算法原理
- 跨越千年的RSA算法
- HTTPS是如何保证连接安全:每位Web开发者都应知道的
完结。
原创不易,如果你觉得本文对你有帮助,希望你能支持一下~
- RSA算法原理及其在HTTPS中的应用
- https原理及其在go中应用
- 一致性hash算法原理及其在分布式中的应用
- HTTPS 原理浅析及其在 Android 中的使用
- HTTPS 原理浅析及其在 Android 中的使用
- RSA算法原理及其Openssl库函数
- 一致性哈希算法原理及其在分布式系统中的应用
- 一致性哈希算法原理及其在分布式系统中的应用
- Raft 算法原理及其在消息队列 CMQ 中的应用(上)
- RSA算法原理及应用示例
- JPEG 原理分析及其在嵌入式 Linux 中的应用
- PCA 原理及其在图像压缩中的应用
- mmap原理及其在ART中的应用(1)
- 编码原理及其在WCDMA系统中的应用
- BlockingQueue的原理浅析及其在项目中的应用
- ZooKeeper 原理及其在Hadoop和HBase中的应用
- ZooKeeper原理及其在Hadoop和HBase中的应用
- ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用
- html标签 后台转义
- 软件测试面试题集合
- 发布到tomcat服务器上webapps里的文件名和项目名称不一样
- 编译安装mysql
- URAL 1486 Equal Squares
- RSA算法原理及其在HTTPS中的应用
- Xcode快捷键及代码块
- 文本替换与删除
- [学习小笔记] Gson的基本使用
- algorithm中for_each用法
- 安卓网络框架总结:
- Metasploit Nessus、Nexpose笔记
- 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结
- 卡片式设计的最佳实践分享