前言
一般来说,目前的安全相关措施一共有两类,一种是加密,其次则是消息摘要。加密很容易理解,加解密数据以达到通信安全的目的。消息摘要则是根据原始数据计算相应编码,如果原始数据被篡改,重新计算时,编码会变化。
- 加密,有对称加密和非对称加密两类,RSA则是非常常见和流行的一种数据加密方式
- 消息摘要,常见的有MD5以及SHA-1等方式
在HTTPS原理文章中,介绍 HTTPS 原理时,可以看到,加密和消息摘要方式都用上了。
RSA
在介绍RSA之前,需要介绍一些数学知识。
互质关系:如果两个正整数,除了 1 以外没有其他公因子,就称这两个数是互质关系。比如 3 和 5,13 和 31 等
欧拉函数:求小于 N 的正整数中与 N 互质的数的数目。φ(N),如果 N 可以分解成两个互质的整数之积,N=pq,则 φ(N)=φ(p)φ(q)=(p−1)(q−1)
模反元素:如果两个正整数 a 和 n 互质,那么一定可以找到整数 b,使得 ab−1 被 n 整除:ab ≡ 1 (mod n)
欧拉定理:当 a,n 为两个互素的正整数时,则有 ≡ {1(modn)
RSA的安全性基于大数的因式分解难度,一般而言,RSA中的密钥长度为1024位,数太大了,目前已经的被破解的最大长度密钥是768位,所以说RSA是安全可靠的。它的原理最后分析,先看看过程。
(1)选择一对不同的、足够大的素数p,q。
(2)计算n=pq。
(3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
(4)找一个与f(n)互质的数e,且1<e<f(n)。
(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。
(6)公钥KU=(e,n),私钥KR=(d,n)。
整个过程一共用到了以下几个数
p q n φ(n) e d
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么,有无可能在已知n和e的情况下,推导出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
而前文有提到,要将一个大整数进行因式分解,这是非常非常困难的一件事,所以RSA算法的安全性是有保障的。
最后,使用公钥加密,加密要用 (n,e)
≡ c (mod n)
而解密要用私钥(n,d)
≡ m (mod n)
消息摘要
消息摘要,其实非常得常见,如果MD5算法,在android中apk的签约中都会乃至的SHA算法等,都是消息摘要,它的特点是单向的,源数据通过算法得到编码,但无法通过编码反推源数据,同时源数据变化一点点都会导致编码变化。
所以消息摘要常常用在这种场景下:接收端收到信息以消息摘要,将信息解密之后,再计算它的消息摘要,如果和收到的消息摘要不一样,则可以判定收到的信息被它人篡改过。
apk签名中用到的SHA算法也是起到类似的作用,除非拥有原签名可以重新签名,否则破解的apk肯定会被识别的。
部分信息来源自:感谢分享
https://www.cnblogs.com/jiftle/p/7903762.html
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
网友评论