RSA算法及其加解密原理
1.什么是RSA加密:
类型:非对称加密,通俗说就是加解密的密钥不同
原理:两个大素数相乘容易,但想要对其乘积进行因式分解却极其困难
公钥:加密明文使用的叫公钥。因为对大素数因式分解很困难,因此可以将乘积公开作为加密密钥,即KU=(e,n)
私钥:解密明文使用的叫私钥,即KR=(d,n)
2.一些字母表示:
(1) n=p*q:拆分大数n为两个大素数p和q
(2) φ(n)=(p-1)(q-1):欧拉函数。
(3) e:随机选择一个的整数(可负),条件是1<e<φ(n),且e与φ(n) 互质
(4) d :由e和φ生成,关系是ed ≡ 1 mod φ(n),读作ed同余于1模φ(n)
(5) 明文:要加密的东西,记作m
(6) 密文:要解密的东西,记作c
3.一些需要了解的数论基础:
(1) 欧拉函数:对于一个正整数n,小于n且和n互质的正整数的个数,记做φ(n),φ(1)被定义为1 。显然,对于质数p,q,满足φ(n) =(p-1)(q-1)
(2) 同余:a≡b (mod m),顾名思义是a,b对m取模的值相等,即余数相等
(3)同余的一些性质:
[1]: 若a≡b (mod m),则a=km+b,或a-b=km,k为整数。因为同余,所以显然差值是m(被模数)的整数倍。
[2]:运算法则:(为方便观看,以下mod写为%,绝对不是懒得打)
(a+b)%p=(a%p+b%p)%p
(a*b)%p=(a%p*b%p)%p
(ab)%p=(a%p)b %p
[3]:若a≡b(%p),则(a+c)≡(b+c) (%p),同加不变
(4) 负数求正模:eg: -3 mod 26
step1>用-1乘26=-26
step2>凑回-3:(-1*26+23)=-3
step3>即求(-1*26+23) mod 26:根据运算法则得原式=(0+23 mod 26) mod 26
step4>原式=23
4.公私钥生成:
(1)随机找两个质数P和Q,P与Q越大,越安全。(例如:61和53)
(2)计算p和q的乘积n。(n=61×53=3233,n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。)
(3)计算 n 的欧拉函数φ(n)。(根据公式φ(n)=(p-1)(q-1)算出φ(3233)等于60×52,即3120)
(4)随机选择一个整数e,条件是1<e<φ(n),且e与φ(n) 互质。(条件是1<e<φ(n),且e与φ(n) 互质。1到3120之间,随机选择了17。)
(5)存在一个整数d,可以使得ed 除以φ(n) 的余数为 1,通过求e的模反数计算出d。(ed ≡ 1 (mod φ(n)),即17*2753 mode 3120=1)
(6)将n和e封装成公钥,n和d封装成私钥。(n=3233,e=17,d=2753,所以公钥就是:3233,17,私钥就是:3233, 2753。)
5.加密:
若明文过长则对明文进行比特串分组,使得每个分组对应的十进制数小于n,然后依次对每个分组m做一次加密,所有分组的密文构成的序列就是原始消息的加密结果,即m满足0<=m<n。
加密算法为:c=me mod n
6.解密:
解密算法为:m=cd mod n
7.举个例子:
已知p=3,q=11,m=20,描述加解密过程:
n=p*q=33
φ(n)=(p-1)(q-1)=2*10=20
取e∈(1,φ(n))=3 ——注:取为φ(n)+1的因数便于下面计算
3d mod 20 =1解得d=7
KU=(e,n)=(3.33)
KR=(d,n)=(7,33)
加密:c=me mod n=14
解密:m=cd mod n=20
8.RSA的证明:
已知c=me mod n,求证m=cd mod n:
从右往左证:将已知带入得cd mod n=(me mod n)d mod n=med mod n
由d的生成过程有ed ≡ 1 mod φ(n),所以ed=k * φ(n)+1:上式=m1+kφ(n) mod n=(m * mkφ(n)) mod n
要证上式=m,转化为证mkφ(n) =1,即消去mkφ(n)项,变为m mod n,然后显然等于m
做到这里需要补充费马小定理
费马小定理:若gcd(a,n)=1,即a和n互质,则 aφ(n) ≡ 1 mod n
可以称为:在模n的意义下,aφ(n)和1是“数论相等”的,即对模n同余
那么我们接着做:
由费马小定理可理解为mkφ(n) 和 1 “相等”:原式=m mod n=m
不想这么理解也可以用运算严格证明:原式=(m mod n)*(mkφ(n) mod n) mod n=m mod n=m
9.拓展欧几里德求乘法逆元(模反数):
10.RSA算法的优劣性:
优点:RSA算法是国际标准算法,属于主流算法之一,应用广泛,兼容性比较广,能够适用于各种不同的系统之中,不容易出现限制问题。
缺点:RSA算法加密长度为2048位,对于服务器的消耗是比较大的,计算速度也比较慢,效率偏低,一般只适用于处理小量数据。