备注: 本文转载自阮一峰老师的博客,仅为自己补充知识点使用,如有侵权请联系本人,我会尽快删除;
背景
RSA来源于三位数学家名字的首字母缩写,是1978年提出的一种常见的非对称加密算法;RSA算法原理依赖于大数分解,其复杂度依赖于密钥的长度;RSA算法的破解成本比较高,需要依赖于穷举攻击;但是随着量子计算等科技的发展,破解RSA的难度在被逐渐降低;当然,对于一般应用只要使用相对较长的密钥,安全性相对还是很高的。
数学基础
-
欧拉函数
(1) φ ( n ) = 1 , i f n = 1 ; φ(n)=1,if n=1; φ(n)=1,ifn=1;
(2) φ ( n ) = n − 1 , i f n 为 质 数 ; φ(n)=n-1,if n为质数; φ(n)=n−1,ifn为质数;
(3)φ(n) = φ(pk) = pk - pk-1, if n可以表示为pk;
(4) φ ( n ) = φ ( p 1 p 2 ) = φ ( p 1 ) φ ( p 2 ) , i f n 可 以 分 解 为 两 个 互 质 数 之 积 ; φ(n) = φ(p1p2) = φ(p1)φ(p2) ,if n可以分解为两个互质数之积; φ(n)=φ(p1p2)=φ(p1)φ(p2),ifn可以分解为两个互质数之积;
(5)φ(n) = φ(p1k1p2k2…prkr) = (p1k1 - p1k1-1)(p2k2 - p2k2-1)…(prkr - prkr-1) = p1k1p2k2…p1k1p2k2(1-p1k1)(1-p2k2)…(1-prkr) = n(1-p1k1)(1-p2k2)…(1-prkr),任意一个大于1的正整数都可以表示为一系列质数的乘积; -
欧拉定理
a φ ( n ) ≡ 1 ( m o d n ) a^{φ(n)} ≡ 1 (mod n) aφ(n)≡1(modn),若a和n互质; -
费马小定理
a p − 1 ≡ 1 ( m o d p ) a^{p-1 } ≡ 1 (mod p) ap−1≡1(modp),若a和p互质;是欧拉定理的特例; -
模反元素
a b ≡ 1 ( m o d n ) , 若 a 与 n 互 质 , 可 以 找 到 一 个 b 满 足 以 上 条 件 ab ≡ 1 (mod n) ,若a与n互质,可以找到一个b满足以上条件 ab≡1(modn),若a与n互质,可以找到一个b满足以上条件
根据欧拉定理 a φ ( n ) = a ∗ a φ ( n − 1 ) ≡ 1 ( m o d n ) a^{φ(n) } = a * a^{φ(n-1) }≡ 1 (mod n) aφ(n)=a∗aφ(n−1)≡1(modn),故a^{φ(n-1) }一定是其中的一个模反元素;
密钥生成
- 随机选择两个不相等的质数p和q,假设p=61, q=53;
- 计算p和q的乘积n, n对应的二进制数的位数即密钥的长度;n=61*53 = 3233, 对应二进制为110010100001,密钥长度为12;
- 计算n的欧拉函数Φ(n),根据欧拉函数第二条和第三条法则可以得到:
φ ( n ) = φ ( p ∗ q ) = φ ( n ) ∗ φ ( n ) = ( p − 1 ) ( q − 1 ) = 3120 φ(n) = φ(p*q) = φ(n)* φ(n) = (p-1)(q-1) = 3120 φ(n)=φ(p∗q)=φ(n)∗φ(n)=(p−1)(q−1)=3120 - 随机选择一个与Φ(n)互质的整数e,且e满足条件1<e<φ(n);假设选择e=17;
- 计算e对φ(n)的模反元素d;
根据模反元素的计算方法,可以得到
e d ≡ 1 ( m o d φ ( n ) ) = > e d − 1 = k φ ( n ) = > d = ( k Φ ( n ) + 1 ) / e ed ≡ 1 (mod φ(n)) => ed - 1 = kφ(n) => d = (kΦ(n) + 1) / e ed≡1(modφ(n))=>ed−1=kφ(n)=>d=(kΦ(n)+1)/e
取k=15,得到其中一个解d=2753; - 将n和e封装为公钥(3233,17),n和d封装成私钥(3233, 2753);
算法可靠性
RSA密钥生成步骤涉及到六个参数p、q、n、φ(n) 、e、d,公钥n和e是公布的,私钥n和d是保密的;因此如果d泄露,那么私钥完全泄露;否则算法的安全性与对n进行大数分解的难度相关;
加密和解密
-
使用公钥(n, e)加密
假设待加密信息为m,使用公钥(n, e)对m进行加密;其中,m必须是小于n的整数(字符串取对应的ASCII和Unicode);加密后信息c满足以下条件:
m e ≡ c ( m o d n ) m^{e} ≡ c (mod n) me≡c(modn)
假定公钥是(3233, 17),加密信息m=65,可以得到加密后信息为c=2790 -
使用私钥(n, d)进行解密,得到原始信息m;
c d ≡ m ( m o d n ) c^{d} ≡ m (mod n) cd≡m(modn)
私钥为(3233, 2753),已加密信息为c=2790 ,可以得到原始信息m=65;