RSA 算法使用心得
一、算法基础
1,RSA 算法基础
RSA 算法是非对称算法 , 使用大数分解原理得到,主要过程主要用到费马小定理,详细数学证明见附加信息
2,RSA 算法描述
找两素数 p 和 q
取 n=p*q
取 t=(p-1)*(q-1)
取任何一个数 e, 要求满足 e<t 并且 e 与 t 互素(就是最大公因数 1 )
取 d*e%t==1 即 (e * d) % ((p-1)*(q-1)) == 1
这样最终得到三个数: n d e
设消息为数 M (M <n)
设 c=(M^d)%n 就得到了加密后的消息 c
设 m=(c^e)%n 则 m == M ,从而完成对 c 的解密。
注: ^ 表示次方 , 上面两式中的 d 和 e 可以互换。具体过程看证明
3,RSA 算法举例
在非对称加密中:
n d 两个数构成公钥,可以告诉别人;
n e 两个数构成私钥, e 自己保留,不让任何人知道。
给别人发送的信息使用 e 加密,只要别人能用 d 解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用 d 加密,这样只有拥有 e 的你能够对其解密。
rsa 的安全性在于对于一个大数 n ,没有有效的方法能够将其分解
从而在已知 n d 的情况下无法获得 e ;同样在已知 n e 的情况下无法求得 d 。
二、举例 :
找两个素数 :
p=47
q=59
这样
n=p*q=2773
t=(p-1)*(q-1)=2668
寻找 e 满足 e<t 并且 e 和 t 互素 找到 e=63
寻找 d 使 e*d%t ==1 得到 d=847
那么 n=2773 d=847
n=2773 e=63
取加密 c = 465
测试 ( 请安装 Active perl )
加密 :
perl -Mbigint -e "print 465**847%2773" 结果为 1118
使用解密结果
perl -Mbigint -e "print 1118**63%2773" 结果为 465
这里一般在加密过程之中 取 d=65537
三、应用 OpenSSL 库里的 RSA 函数过程
1 ,加密分组
使用 RSA 加密的分组长度为
modulusLen = (publicKey->bits + 7) / 8 - 11;
2 ,数据补偿
RSA 核心加密算法加密的数据长度为
modulusLen = (publicKey->bits + 7) / 8;
那么要补偿 11 位的数据 ( 很多算法加密结果不一样的原因大都是由这个原因引起的 )
其中第 1 , 2 (为模式)
以后的 2 - 10 为 0xff
11 位为 0
3 ,核心算法
1 ,大数运算
大数的加减乘除方法
2, 高阶求模 (m^e mod n)
a = (b * c) % d <==> ( (a % d )*( c % d) ) % d
可以使用分解成 (b *c) % d
运算次数可以分解为 log(c)
3 ,加密运算
很简单 , 请参看代码
4 ,解密运算
1, 一种方法是与加密过程类似解密 使用解密密钥
附加数学证明
数学原理
命题 :
若 p, q 是相异质数 , rm == 1 mod (p-1)(q-1),
a 是任意一个正整数 , b == a^m mod pq, c == b^r mod pq,
则 c == a mod pq ( 补充 如果 pq>=a > 0 那么 c==a)
证明的过程 :
证明的过程 , 会用到费马小定理 , 叙述如下 :
m 是任一质数 , n 是任一整数 , 则 n^m == n mod m
注意注释 写法的意思同 ( (n^m) mod m ) = (n mod m ) )
( 换另一句话说 , 如果 n 和 m 互质 , 则 n^(m-1) == 1 mod m)
运用一些基本的群论的知识 , 就可以很容易地证出费马小定理的 ........
证明
因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数
因为在 modulo 中是 preserve 乘法的
(x == y mod z and u == v mod z => xu == yv mod z),
所以 , c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq
1. 如果 a 不是 p 的倍数 , 也不是 q 的倍数时 ,
则 a^(p-1) == 1 mod p ( 费马小定理 ) => a^(k(p-1)(q-1)) == 1 mod p
a^(q-1) == 1 mod q ( 费马小定理 ) => a^(k(p-1)(q-1)) == 1 mod q
所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1
即 a^(k(p-1)(q-1)) == 1 mod pq
=> c == a^(k(p-1)(q-1)+1) == a mod pq
2. 如果 a 是 p 的倍数 , 但不是 q 的倍数时 ,
则 a^(q-1) == 1 mod q ( 费马小定理 )
=> a^(k(p-1)(q-1)) == 1 mod q
=> c == a^(k(p-1)(q-1)+1) == a mod q
=> q | c - a
因 p | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod p
=> p | c - a
所以 , pq | c - a => c == a mod pq
3. 如果 a 是 q 的倍数 , 但不是 p 的倍数时 , 证明同上
4. 如果 a 同时是 p 和 q 的倍数时 ,
则 pq | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod pq
=> pq | c - a
=> c == a mod pq