RSA加密与解密
RSA的原理
本文不深入到数学定理
加密:
m
e
≡
c
(
m
o
d
N
)
m^e \equiv c \pmod N
me≡c(modN)
上面的公式解释:m的e次方与c 对模N同余。 简单理解即:
m
e
÷
N
=
x
.
.
.
c
m^e \div N = x ...c
me÷N=x...c (me为被除数,N为除数,x为商,商不会用到,c为余数)
m为要加密的数字(明文),[N, e]这两个数组成一个公钥,c为密文。
解密:
c
d
≡
m
(
m
o
d
N
)
c^d \equiv m \pmod N
cd≡m(modN)
同样:
c
d
÷
N
=
y
.
.
.
m
c^d \div N = y ...m
cd÷N=y...m(cd为被除数,N为除数,y为商,商不会用到,m为余数)
[N, d]这两个数组成一个私钥。
上面两个公式连合起来解释一遍:
有个数m, 用me 除以N得到余数c,用cd除以N求余数又得回了m.
明文 | 钥匙 | 过程 | 结果 | |
---|---|---|---|---|
加密 | m | [N, e]公开的 | m e ÷ N = x . . . c m^e \div N = x ...c me÷N=x...c | c |
解密 | c | [N, d]要保密 | c d ÷ N = y . . . m c^d \div N = y ...m cd÷N=y...m | m |
N, e, d的关系是什么?
N e d当然不是随便选的。
公式推导过程:
- 数论中的欧拉定理:
m Φ ( N ) ≡ 1 ( m o d N ) m^{\Phi(N)} \equiv 1 \pmod N mΦ(N)≡1(modN) (m, N为正整数,且m, N互质) - 跟据同余定理,两边可同时算k次方,1的k次方还是1
m Φ ( N ) ⋅ k ≡ 1 k ( m o d N ) m^{\Phi(N)\cdot k} \equiv 1^k \pmod N mΦ(N)⋅k≡1k(modN) - 跟据同余定理,两过可以同时乘以m
m Φ ( N ) ⋅ k + 1 ≡ 1 k ⋅ m ( m o d N ) m^{\Phi(N)\cdot k +1 } \equiv 1^k \cdot m \pmod N mΦ(N)⋅k+1≡1k⋅m(modN) - 简化
m Φ ( N ) ⋅ k + 1 ≡ m ( m o d N ) m^{\Phi(N)\cdot k +1 } \equiv m \pmod N mΦ(N)⋅k+1≡m(modN) - 设有正整数e和d
e ⋅ d = Φ ( N ) ⋅ k + 1 e \cdot d = {\Phi(N)\cdot k +1 } e⋅d=Φ(N)⋅k+1(注意至此 N, d, e都有了) - 上面的式子可写成
e ⋅ d ≡ 1 ( m o d Φ ( N ) ) e \cdot d \equiv 1 \pmod{\Phi(N)} e⋅d≡1(modΦ(N))(注意是 ( m o d Φ ( N ) ) \pmod{\Phi(N)} (modΦ(N)), 不是 ( m o d N ) \pmod{N} (modN))
当e与 Φ ( N ) \Phi(N) Φ(N)互质时,根据欧拉定理可知,正整数d一定存在( e ⋅ e Φ ( Φ ( N ) ) − 1 ≡ 1 ( m o d Φ ( N ) ) e \cdot e^{\Phi(\Phi(N))-1} \equiv 1 \pmod {\Phi(N)} e⋅eΦ(Φ(N))−1≡1(modΦ(N))) - 因此
m e ⋅ d ≡ m ( m o d N ) m^{e\cdot d} \equiv m \pmod N me⋅d≡m(modN) - 有了上面这个条件之后
如果有 m e ≡ c ( m o d N ) m^{e} \equiv c \pmod N me≡c(modN) , 两边同时升d次幂,可得解密运算公式。
进一步理解N, e, d
Φ(N)是什么?
Φ ( N ) {\Phi(N)} Φ(N)是欧拉函数。(a为质数时欧拉函数可写成: Φ ( a ) = a − 1 {\Phi(a)}=a-1 Φ(a)=a−1)
N如何选择?
选取两个大质数p,q。 让 N = p ⋅ q N=p\cdot q N=p⋅q,则有 Φ ( N ) = ( p − 1 ) ( q − 1 ) {\Phi(N)} = (p-1)(q-1) Φ(N)=(p−1)(q−1)(参考积性函数的性质)
e如何选择?
e是公钥的一部分,通常是65537(这是个质数)
d如何选择?
根据等式 d = Φ ( N ) ⋅ k + 1 e d = \frac{\Phi(N)\cdot k +1 }{e} d=eΦ(N)⋅k+1 , e, N 都已经确定,k越小,d就越小,k,d都为正整数时能使等式成立的最小值。(注意这里可见d不是唯一的)
为什么说加密容易解密难?
- 模运算(求余数),有快速算法。搜:快速幂取模运算
- 如果想用解密公式倒推,会遇到离散对数问题。搜:离散对数问题
- 又如果想知道d, 要知道d就要知道 Φ ( N ) = ( p − 1 ) ( q − 1 ) {\Phi(N)} = (p-1)(q-1) Φ(N)=(p−1)(q−1),进一步要知道两个质数,只知道N, N = p ⋅ q N=p\cdot q N=p⋅q,大数的质因数分解目前还没有快速求解的方法。
- 其他,搜:RSA攻击方法
- 量子计算破解,搜:秀尔算法
RSA 公钥与私钥
//私钥里都有些什么?
pc:~r$ openssl genrsa -out private.key 16//生成一个RSA私钥,取16位方便计算与观察
pc:~r$ openssl rsa -in private.key -text -noout
Private-Key: (16 bit)
modulus: 43931 (0xab9b)//模数,想当于N,可见当我们说一个密钥有多少位时,说的是模数,而不是生成模数的两个质数
publicExponent: 65537 (0x10001)//公钥里的e
privateExponent: 30329 (0x7679)//私钥里的d
prime1: 223 (0xdf)//大质数p
prime2: 197 (0xc5)//大质数q
exponent1: 137 (0x89)
exponent2: 145 (0x91)
coefficient: 60 (0x3c)
pc:~$ openssl rsa -in private.key -pubout -out public.key //生成公钥
//公钥里都有些什么?
pc:~$ openssl rsa -in public.key -text -noout -pubin
Public-Key: (16 bit)
Modulus: 43931 (0xab9b)//模数N
Exponent: 65537 (0x10001)//公钥里的e
//是否与公式一致?
N = p x q
43931 = 223 x 197
e x d = Φ(N) x k + 1
65537 x 30329 = (223-1)x (197-1) x k + 1
k = 45681
pc:~$ openssl prime 65537
10001 (65537) is prime
pc:~$ openssl prime 223
DF (223) is prime
pc:~$ openssl prime 197
C5 (197) is prime
pc:~$ openssl prime 4
4 (4) is not prime
总结
- 由公式可知,公钥与私钥都是既可加密又可以解密。
- openssl生成的私钥文件里包函了公钥的信息。
参考资料:网易公开课之现代密码学