一,基本数学知识
1.素数:
也叫质数,特点是除了1和自身,再没有其他数字能整除它。例如9除了1和9,还有3能整除9,因此9不是素数。
2.欧拉函数:
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?),计算这个值的方法就叫做欧拉函数,以φ(n)表示。
3.因数分解
例如 15可以分解为 15 = 3x5
4.互质关系
例如9和17之间没有公因数(当然1是不能算的),所以9和17之间构成互质关系。
5.同余
例如 ed ≡ 1 (mod φ(n)) 表示ed和1对n同余。意思是 ed对n求余的结果和 1对n求余的结果一样,即他们有同样的余数
二,RSA原理
RSA加密算法主要 由这几个参数有关:p,q,n,φ(n),e,d,m,c
p和q:首先p和q是两个质数,可以任取,但p,q越大RSA越安全
n:n=pxq,n为p和q的乘积,n表示密钥的长度(公钥和私钥)。
φ(n):φ(n) = (p-1)(q-1)
e:随机选择的一个整数,要满足 1<e<φ(n),且e与φ(n)互质。而且e为公钥的组成元素
d:e 的模反元素(下面有说怎么求),而且e为私钥的组成元素。求d的公式
m:明文
c:密文
RSA的公钥,私钥和加密,解密方式如下表:
公钥KU (由n和e组成) | n:两个素数p和q的乘积 e:与(p-1)和(q-1)互质的数 |
私钥KR (由d和n组成) | d和n |
加密方式 | |
解密方式 |
三,例子描述
(1)求得公钥和私钥
令p=3,q=11,则 n=p*q = 3x11 = 33,φ(n)=(p-1)(q-1)=20;再取 e =3( 3与20互质),接下来要求d:
d为e的模反元素,模反元素即是指有一个整数d,可以使得ed被φ(n)除的余数为1,写成数学式子是:
又e=3,φ(n)=20所以:
又因为1模上任何数都是1,所以上式又表示为 3d%20 = 1,这个式子正规的话要使用扩展欧几里得算法求解,但基于数字比较小,我们可以看出来,当d = 7时,21%20 = 1成立,所以取 d = 7
n,e,d出来后,公钥和私钥就出来了:
公钥KU = (e,n)=(3,33)
私钥KR = (d,n)=(7,33)
(2)英文转数字
将明文的英文信息数字化,就需要一个编码表,假设我们的编码表a~z对应数字01~26:
字母 | a | b | c | d | e | f | g | h | i | j | k | l | m |
码值 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 |
字母 | n | o | p | q | r | s | t | u | v | w | x | y | z |
码值 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
假设我们要编码的明文为 hi,则将hi转化为编码则是: 08,09
(3)明文加密
加密方式为:,代入 e =3,n=33,得:,代入明文08,09:
,由于512%33 = 17,所以 c1%33也要等于17,所以取c1=17
,由于729%33= 3,所以c2%33也要等于3,所以取c2=3
所以hi加密后的密文为:17,3
(4)密文解密
解密方式为:(n是公开的,所以d绝对不能泄露,d泄露了,就等于私钥泄露了),代入d=7,n=33,
得:,代入密文17,3:
,由于410338673%33=8,所以m1%33也要等于8,所以取m1为8
,由于2187%33=9,所以m2%33也要等于9,所以取m2为9
所以解密后的明文为 8,9,对应编码表,则为 hi。
(5)破解RSA
由于公钥是公开的,若要破解RSA则要破解私钥,由于私钥KR为(d,n),n是公钥组成部分,所以n也是公开的,所以问题等价于破解d即可。
由,e是公钥里的,所以e也是公开的,所以要求d就要知道φ(n)
由于:φ(n) = (p-1)(q-1),所以,问题又等价于要求p和q,根据已有的信息,n=p*q,所以从n入手,把 n 作因数分解就行了,
因数分解的意思是,例如45,可以分解为45=3x3x5,这样的分解结果是独一无二的,这也是p和q必须是质数的原因,因为当p和q都是质数,则 n = pxq 是独一无二的,p和q越大,则n越难被分解。
当n=629这样小的数时,通过程序可进行穷举式的暴力破解:
num = 629
for p in range(num):
for q in range(num):
if p*q==num:
print('p=%d,q=%d' %(p,q))
但当n很大时,程序运行时间就会很长,所以一般p和q都是非常大的质数。
当p,q求出来后,d就可以算出来了,这样私钥也就出来了