用python编程实现RSA加密与解密过程。要求: 不能直接调用现成的函数库,要直接使用RSA计算公式; 能够对任意长度的ASCII字符进行加密处理,按每个字符进行分组处理; RSA中的3个参数p、q、e使用随机函数从100-999之间的3位数质数中随机选择,用自己的座号作为随机数的种子; 加密后的数据用Base64编码后存储,Base64编码、解码可以直接调用现成的方法
时间: 2023-03-29 17:02:15 浏览: 242
很高兴回答你的问题。对于RSA加密与解密过程,我可以给出以下步骤:
1. 首先,选择两个不同的质数p和q,计算它们的乘积n=p*q。
2. 计算欧拉函数φ(n)=(p-1)*(q-1)。
3. 选择一个整数e,使得1<e<φ(n)且e与φ(n)互质。
4. 计算e关于φ(n)的模反元素d,即满足ed≡1(mod φ(n))的最小正整数d。
5. 公钥为(n,e),私钥为(n,d)。
6. 加密过程:将明文分组,每个分组转换成ASCII码后,计算密文C=M^e(mod n),其中M为明文,C为密文。
7. 解密过程:将密文分组,每个分组转换成ASCII码后,计算明文M=C^d(mod n),其中C为密文,M为明文。
8. 最后,将加密后的数据用Base64编码后存储。
需要注意的是,p、q、e这三个参数需要使用随机函数从100-999之间的3位数质数中随机选择,用自己的座号作为随机数的种子。同时,不能直接调用现成的函数库,要直接使用RSA计算公式。
相关问题
RSA加解密文件Python
### 使用Python实现RSA加密和解密文件
为了使用Python进行RSA加解密操作,可以采用`M2Crypto`库来处理具体的加密细节。下面展示的是基于该库的简单方法以及相应的代码实例。
#### 安装依赖库
在开始之前,确保已经安装了必要的第三方模块——即`M2Crypto`库。可以通过pip工具轻松完成这一过程:
```bash
pip install M2Crypto
```
#### 加载或生成密钥对
如果已有现成的密钥对可以直接加载;如果没有,则需先创建一对新的公私钥用于后续的操作[^1]。
```python
from M2Crypto import RSA, BIO
def generate_keys():
rsa = RSA.gen_key(2048, 65537)
private_bio = BIO.MemoryBuffer()
public_bio = BIO.MemoryBuffer()
rsa.save_key_bio(private_bio, None)
rsa.save_pub_key_bio(public_bio)
private_pem = private_bio.read()
public_pem = public_bio.read()
with open('private.pem', 'wb') as f:
f.write(private_pem.encode())
with open('public.pem', 'wb') as f:
f.write(public_pem.encode())
generate_keys()
```
这段脚本会生成长度为2048位的新密钥,并将其保存到当前目录下的两个PEM格式文件中:一个是仅限于持有者的私钥(`private.pem`),另一个是可以公开分享给其他人的公钥(`public.pem`)。
#### 文件加密流程
对于待加密的目标文件,读取其二进制数据并利用公钥对其进行分段加密。由于单次加密的数据量有限制(取决于所选模数大小),因此可能需要多次调用API接口才能完整地保护整个文档的内容。
```python
import base64
from M2Crypto import RSA
CHUNK_SIZE = 190 # 每块最大可加密字节数,具体数值视情况调整
with open('public.pem') as pub_file:
key_data = pub_file.read().encode()
pub_rsa = RSA.load_pub_key_bio(BIO.MemoryBuffer(key_data))
def encrypt_file(input_path, output_path):
with open(input_path, "rb") as infile, \
open(output_path, "w") as outfile:
while True:
chunk = infile.read(CHUNK_SIZE)
if not chunk:
break
encrypted_chunk = pub_rsa.public_encrypt(chunk, RSA.pkcs1_padding)
encoded_chunk = base64.b64encode(encrypted_chunk).decode()
outfile.write(encoded_chunk + '\n')
encrypt_file("example.txt", "example_encrypted.txt")
```
此函数接收输入路径参数指定要被加密的原始文件位置,而输出路径则决定了经过编码后的密文应当存储在哪里。注意这里采用了Base64编码方式以便更好地表示二进制形式的结果。
#### 文件解密流程
当接收到已加密的信息时,通过对应的私钥逐部分恢复原文档中的信息。同样考虑到效率问题,在实际应用过程中应该考虑批量处理多个区块的情况。
```python
from M2Crypto import RSA
with open('private.pem') as pri_file:
key_data = pri_file.read().encode()
pri_rsa = RSA.load_key_bio(BIO.MemoryBuffer(key_data))
def decrypt_file(input_path, output_path):
with open(input_path, "r") as infile,\
open(output_path, "wb") as outfile:
for line in infile.readlines():
decoded_line = base64.b64decode(line.strip().encode())
decrypted_line = pri_rsa.private_decrypt(decoded_line, RSA.pkcs1_padding)
outfile.write(decrypted_line)
decrypt_file("example_encrypted.txt", "decrypted_example.txt")
```
上述程序片段展示了如何从先前加密过的文本文件中提取每行作为单独单元来进行解码工作,并最终重建出原版未受干扰的消息副本。
阅读全文