RSA
一、RSA介绍
RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密、解密密钥进行解密。 在RSA算法中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)KR是需要保密的。 加密算法E和解密算法D也都是公开的。
对极大整数做因数分解的难度决定了RSA算法的可靠性。 换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。 但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
二、RSA算法详解
RSA的加密过程可以通过一个公式来表示:
加密:
解密:
rsa加密的python实现过程
首先要生成两个大素数 p, q (保密)
计算 n=pq,= (p-1)*(q-1)。【n公开;
即欧拉函数值,需要保密 】
随机选取正整数 ,满足。
【e是公开的加密密钥,即E 】
计算d,满足。【d是保密的解密密钥】
由此得到公钥(n,e),私钥 (n,d) 或 (n,p,q)。
加密变换:对于明文 m ,密文为 n。
解密变换:对于密文 c ,明文为 n。
大素数生成
Miller-Rabin 素性检测(Miller-Rabin Primality Test)是一种基于概率的素数检测算法,常用于判断一个大整数是否为素数。它比最基本的试除法效率高得多,是目前实际应用中(比如RSA密钥生成)经常使用的一种方法。
假设我们想检测一个奇数 n>2 是否为素数:
- 分解 n−1 的形式
将 n−1 分解为,其中 d 是奇数(非“奇素数”,只需为奇数)。
示例:- 若 n=25 ,则 n−1=24=
,此时 s=3 ,d=3。
- 若 n=9 ,则 n−1=8=
,此时 d=1。
- 若 n=25 ,则 n−1=24=
- 选择基数 a
随机选取 a 满足 1<a<n−1 。通常选择多个不同的 a 以提高准确性。 - 模幂计算与判定
- 计算
。
- 若 x≡1 mod n 或 x≡n−1 mod n:通过当前测试,继续下一轮。
- 否则:循环平方 x 最多 s−1 次,每次计算 x=x^2 mod n。
- 若某次得到 x ≡ n−1 mod n,则通过当前测试。
- 若所有循环后仍未通过,则 n 为合数。
- 计算
- 重复测试
用不同的 a 重复上述步骤。选择 k 个不同的 a ,可将误判概率降至。
下面我给出python的代码实现:(部分做了微调)
1 | # 针对随机取得p,q两个数的素性检测 |
这里我们看到在测试的时候,使用到了大数的幂次取模,所以这里我们要先实现大数模的算法,如下:
1 | # 模N大数的幂乘的快速算法 |
下面给出大素数生成的代码吧:(上面的重复内容不再写出)
1 | # 生成大素数: |
我们得到生成的大素数之后,就比较简单了。
生成密钥
这里直接给出代码实现:
1 | # 生成密钥(包括公钥和私钥) |
至此我们得到了公钥和私钥。
加解密实现
1 | #加密 |
测试结果
可以完成读取文本的加密,注意标点符号如果是中文的标点,会出现乱码,但不会影响信息的读取。
完整代码
1 | import random |