公钥加密体制模型
- 发送方A查找接收方B的公钥;
- A采用公钥加密算法用B的公钥对明文进行加密;
- A通过不安全信道将密文发送给B;
- B收到密文后使用自己的私钥对密文解密还原出明文。
单向陷门函数
- 给定x,计算 y=f(x) 是容易的
- 给定y,计算 x 使得 y=f(x) 是困难的
- 存在δ,已知δ时,对给定的任何y,若相应的x存在,则计 算 x 使 y=f(x) 是容易。
注意:
- 仅满足(1)、(2)两条的称为单向函数;第(3)条称为陷门性,δ 称为陷门信 息。
- . 当用陷门函数f作为加密函数时,可将f公开,这相当于公开加密密钥。此时 加密密钥便称为公钥,记为Pk。 f函数的设计者将δ 保密,用作解密密钥,此时δ 称为私钥,记为Sk。由于加密函数是公开的,任何人都可以将信息x加密成y=f(x), 然后送给函数的设计者(当然可以通过不安全信道传送);由于设计者拥有Sk, 他自然可以解出 x = f − 1 ( y ) x=f^{-1}(y) x=f−1(y)
- 单向陷门函数的第(2)条性质表明窃听者由截获的密文y=f(x)推测x是不可行的
公钥体制基本原理(单向陷门函数)
- 正向计算很容易,如果知道公开秘钥 P k P_{k} Pk和消息M容易计算: C = f P k ( M ) C=f_{P_{k}}(M) C=fPk(M)
- 在不知道私有秘钥 S K S_{K} SK的情况下,方向计算不可行。就算你知道加密后的消息C而不知道私有秘钥 S K S_{K} SK,也计算不出明文 M = f − 1 ( C ) M=f^{-1}(C) M=f−1(C)
- 在知道私有秘钥 S K S_{K} SK的情况下,反向计算很容易。有消息C和私有秘钥 S K S_{K} SK,容易计算 M = f − 1 ( C ) M=f^{-1}(C) M=f−1(C)。 S K S_{K} SK相当于陷门,它和公开密钥 P K P_{K} PK配对使用。
RSA加密算法
在Diffie和Hellman提出公钥密码体制的设想两年后,先后 有MH背包公钥密码,Rivest、Shamir、Adleman联合提出 的RSA公钥密码算法,这是目前应用最广的一种公钥密码
RSA的理论基础是欧拉定理,其安全性依赖于大整数的素 因子分解的困难性
基本知识
欧拉定理
- 欧拉函数φ(m):当 m > 1时,φ(m)表示比m小且与m互素的正整数的个数。比如:m = 4,互为素数的数有1,3。φ(m)=2特别强调1要算进去。
- m是素数时:φ(m) = m-1
- m = pq,且p和q都是素数时: φ ( m ) = φ ( p ) φ ( q ) = ( p − 1 ) ( q − 1 ) \varphi (m)=\varphi (p)\varphi (q)=(p-1)(q-1) φ(m)=φ(p)φ(q)=(p−1)(q−1)
- 对于任何互素的两个整数a和n,有: α φ ( n ) = 1 m o d n \alpha^{\varphi(n)}=1\,mod \, n αφ(n)=1modn 例 如 : a = 3 , n = 8. 求 3 4 = 81 = 1 m o d 8 ( 此 时 φ ( n ) = φ ( 8 ) = n u m 1 , 3 , 5 , 7 = 4 ) 例如:a=3,n=8.求3^{4}=81=1mod\,8(此时\varphi(n)=\varphi(8)=num{1,3,5,7}=4) 例如:a=3,n=8.求34=81=1mod8(此时φ(n)=φ(8)=num1,3,5,7=4)
- 当n = p时, a p − 1 = 1 m o d p a^{p-1}=1\,mod\,p\, ap−1=1modp是费马定理,其中 P 是质数, a a a 不是 p 的倍数。
模基本运算规则
- 结合律 ( ( a + b ) % p + c ) % p = ( a + ( b + c ) % p ) % p ((a+b)\%p+c)\%p=(a+(b+c)\%p)\%p ((a+b)%p+c)%p=(a+(b+c)%p)%p ( ( a b ) % p ∗ c ) % p = ( a ∗ ( b c ) % p ) % p ((ab)\%p * c)\%p= (a * (bc)\%p)\%p ((ab)%p∗c)%p=(a∗(bc)%p)%p
- 交换律
- 分配律
欧拉函数应用举例
算法描述——密钥生成
- 选取两个互异大素数p,q
- 计算n=pq和欧拉函数值 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)=(p-1)(q-1) φ(n)=(p−1)(q−1)
- 选一个整数e,1<e< φ ( n ) \varphi(n) φ(n),使得gcd(φ(n),e)=1
- 在模φ(n)下,计算e的逆元d,使得ed≡ 1mod φ(n)
我们以(n,e)为公钥,d为密钥,p,q不再需要可以销毁.
g
c
d
(
a
,
b
)
非
负
整
数
a
,
b
的
最
大
公
因
数
gcd(a,b)非负整数a,b的最大公因数
gcd(a,b)非负整数a,b的最大公因数
在第一步中有素性检测,第四步有欧几里得算法:
d
e
+
k
φ
(
n
)
=
1
d
e
=
1
m
o
d
φ
(
n
)
de+k\,\varphi(n)=1\,\,\,\,de=1\,mod\,\varphi(n)
de+kφ(n)=1de=1modφ(n)
具体算法描述
加密:
将明文分组,各组对应十进制数 m<n,计算
C = E(m) ≡
m
e
m^{e}
me mod n
解密:
m = D© ≡
C
d
C^d
Cd mod n
注意:
“≡”是数论中表示同余的符号(注意!!这个不是恒等号),
同余的定义是这样的:
给定一个正整数n,如果两个整数a和b满足a-b能被n整除,即(a-b)modn=0,
那么就称整数a与b对模n同余,记作a≡b(modn),同时可成立amodn=b。
也就是相当于a被n整除余数等于b的意思。
RSA算法解密过程的正确性
RSA举例:
准备好草稿本溜一圈儿,或许你没懂!!!
那么请问d是怎么来的?
逆元d的求解
- 用扩展的欧几里德算法(辗转相除法)
求乘法逆元e=1234,φ(n)=11111,求d?
RSA算法的一些计算问题
- 如何计算 m e m o d n m^{e}\,mod\,n memodn?
- 如何判定一个给定的整数是素数?
- 如何找到足够大的素数p,q?
计算 m e m o d n m^{e}\,mod\,n memodn:
- (a b) mod n = [(a mod n) x (b mod n)] mod n]
算法归纳
- 选择两个大素数p和q,通常要求每个均大于
10
0
100
100^{100}
100100。
计算n=p,q和z=φ(n)=(p-1)(q-1)。
找到一个和z互素的e,把它作为公钥。
找到一个d满足ed=1 (mod z)。 - 选好这些参数后,将明文划分成块,使得每个明文报文 P长度m满足0<m<n。加密P时,计算C= P e ( m o d n ) P^e(mod\,n) Pe(modn),解 密C时计算P= C d ( m o d n ) C^d(mod\,n) Cd(modn)。由于模运算的对称性,可以 证明,在确定的范围内,加密和解密函数是互逆的。
- 为实现加密,需要公开(e, n),为实现解密需要(d, n)。