整个RSA过程大体是 生成秘钥、加密、解密3个步骤
第一步 生成秘钥
选两个素数 p,q 保密,然后计算 n=pq 公开,
在1<e<Ø(n)范围内选择一个数e作为公钥,e要与Ø(n)互素就行,即gcd(Ø(n),e)=1
求出私钥 d≡e^-1 mod Ø(n)
所以 公钥PU={e,n}, 私钥 PR={d,n}
第二步 加密(sender)
C=M^e mod n=
第三步 解密(receiver)
M=C^d mod n=
下面一起举个例子看看:
- 得出公钥和私钥
- 选择两个素数,p=17, q=11
- 计算 n=pq=17*11=187
- 计算Ø(n)=(p-1)(q-1)=160
- 选择e使其与Ø(n)互素且小于Ø(n), 我们随便选个e=7
- 确定d使得de≡1 (mod 160) 且d<160, 因为23*7=161,所以d=23, 这里d可以利用扩展的欧几里得算法求出
所以 公钥PU={7, 187} 私钥 PR={23, 187}
- 加密
如果明文M=88, 则
密文 C=M^e mod n=88^7 mod 187=
88^1 mod 187=88
88^2 mod 187=7744 mod 187=77
88^4 mod 187= 59969536 mod 187= 132
88^7 mod 187=(88^4* 88^2 *88^1) mod 187=(132*77*88) mod 187= 894432 mod 1877=11
- 解密
M=C^d mod n= 11^23 mod 187=
11^1 mod 187=11
11^2 mod 187=121
11^4 mod 187= 121*121 mod 187=55
11^8 mod 187= 55*55 mod 187=33
11^16 mod 187= 33*33 mod 187=154
11^23 mod 187= (11^16* 11^4 *11^2 *11^1) mod 187= 154*55*121*11 mod 187=88
RSA算法保密性分析:
发送方C=M^e mod n知道 e, n
接收方M=C^d mod n 知道 d , n
要想得出e,那么发送方一定知道 Ø(n), 要想知道 Ø(n)发送方一定知道 p,q ,所有当然知道n
接收方要想得出 d,
上面是简洁的介绍,下面再强调一些细节:
RSA体制是一种分组密码,其明文和密文均是0到n-1之间的整数,通常n的大小为1024位二进制或者309位十进制,也就是n<2^1024。
RSA算法使用乘方算法,明文以分组为单位进行加密,每个分组的二进制均小于n,也就是说分组的大小必须小于或等于log2(n+1) +1, 在实际应用中,分组的大小是i位,其中 2^i<n<=2^(i+1), 对于明文分组 M 和密文分组 C进行加解密。
解密公式化简一下是 M=C^d mod n= (M^e)^d mod n= M^(ed) mod n
其中收发双方都知道n,发送方知道e,接收方知道d
RSA算法成立的条件是什么?
- 可以找到e,d,n, 使得对所有M<n, 有M^(ed) mod n=M
- 对所有M<n, 计算 M^e mod n 和 C^d是比较容易的
- 由e和n确定d是不可行的