用RSA算法加密文本文件
- 写文目的
- 任务说明
- 代码实现
- (1)RSA加密比较小的txt文件
- (2)生成1M和1G的txt文件
- (3)加密1M的txt文件
- 调试过程
写文目的
当时参照网上其他文章写的,但是可能对编码不是很熟悉,然后就遇到各种错,感觉网上的文有的很杂很乱,举的例子也不好,文本太短了,根本没说到一些问题,希望能给别人一个解决的参照吧。
任务说明
编写RSA程序,加密一段文字,了解RSA算法原理。尝试加密1M和1G的文字,记录程序的运行时间。使用DES算法加密相同的文字,比较两种算法加密的速度。
代码实现
(1)RSA加密比较小的txt文件
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
#RSA加密
def my_RSA(m_file,c_file):#传入明文文件和密文文件名
filename_m = m_file#明文的文件
filename_c = c_file#加密后的文件
#生成公钥私钥
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
#使用公钥加密
try:
fp = open(filename_m,"r",encoding="utf-8")
print("%s 文件打开成功" % filename_m)
s = fp.read()
fp.close()
except IOError:
print("%s文件打开失败" % filename_m)
rsakey = RSA.importKey(open("public.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey) #创建用于执行pkcs1_v1_5加密或解密的密码
#m = s
m = s.encode('utf-8')
c = []
print("===================================加密的密文:=====================")
for i in range(0,len(m),100):
cipher_text_temp = base64.b64encode(cipher.encrypt(m[i:i+100]))
print(cipher_text_temp.decode('utf-8'))
c.append(cipher_text_temp.decode('utf-8')+"\n")
print("====================================================================")
cipher_text = "".join(c)
#使用私钥解密
encrypt_text = cipher_text.encode('utf-8')
rsakey = RSA.importKey(open("private.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey) #创建用于执行pkcs1_v1_5加密或解密的密码
c_to_m = []
for j in range(0,len(c)):
text_temp = cipher.decrypt(base64.b64decode(c[j]), "解密失败")
print(text_temp.decode('utf-8',"ignore"))
c_to_m.append(text_temp)
try:
fp2 = open(filename_c,"a+",encoding="utf-8")
print("%s 文件打开成功" % filename_c)
print(cipher_text,file=fp2)#将加密后的密文写入到c_rsa.txt文件中
fp2.close()
except IOError:
print("%s文件打开失败" % filename_c)
my_RSA("m.txt","c_rsa.txt")
运行结果:
(2)生成1M和1G的txt文件
#生成1M文件和1G文件
import os
import time
filename_c1 = "m_1M.txt"
filename_c2 = "m_1G.txt"
def get_FileSize(filePath):
fsize = os.path.getsize(filePath)
fsize = fsize/float(1024 * 1024)
return fsize
t1 = time.time()
try:
fp1 = open(filename_c1,"a",encoding="utf-8")
size1 = get_FileSize(filename_c1)
text1 = "6月7日0-24时,广东省新增10例本土确诊病例,广州报告;\
另有本土无症状感染者转确诊病例9例,广州报告4例、深圳报告3例、\
佛山和湛江各报告1例。\
全省新增境外输入确诊病例3例,广州报告,分别来自柬埔寨、卡\
塔尔和赞比亚。新增境外输入无症状感染者9例,广州报告5例,分别来自美国\
、英国、柬埔寨、吉布提和布隆迪;佛山报告1例,来自法国;肇庆报告3例,\
2例来自刚果金,其余1例来自喀麦隆。新增出院1例。\
截至6月7日24时,全省累计报告新冠肺炎确诊病例2564例(境外输入1055例)。目前在院157例。"
text1 = text1*2**10
while(size1<1):
print(text1,file=fp1)#将加密后的密文写入到c_rsa.txt文件中
fp1.close()
size1 = get_FileSize(filename_c1)
print("============",size1)
if(size1 > 0.9):
print("1M Have finished 90%")
elif(size1 > 0.8):
print("1M Have finished 80%")
elif(size1 > 0.7):
print("1M Have finished 70%")
elif(size1 > 0.6):
print("1M Have finished 60%")
elif(size1 > 0.5):
print("1M Have finished 50%")
elif(size1 > 0.4):
print("1M Have finished 40%")
elif(size1 > 0.3):
print("1M Have finished 30%")
elif(size1 > 0.2):
print("1M Have finished 20%")
elif(size1 > 0.1):
print("1M Have finished 10%")
else:
pass
fp1 = open(filename_c1,"a",encoding="utf-8")
fp1.close()
except IOError:
print("%s文件打开失败" % filename_c1)
t2 = time.time()
print("1M完成时间:",t2-t1)
try:
fp2 = open(filename_c2,"a",encoding="utf-8")
size2 = get_FileSize(filename_c2)
text2 = "6月7日0-24时,广东省新增10例本土确诊病例,广州报告;\
另有本土无症状感染者转确诊病例9例,广州报告4例、深圳报告3例、\
佛山和湛江各报告1例。\
全省新增境外输入确诊病例3例,广州报告,分别来自柬埔寨、卡\
塔尔和赞比亚。新增境外输入无症状感染者9例,广州报告5例,分别来自美国\
、英国、柬埔寨、吉布提和布隆迪;佛山报告1例,来自法国;肇庆报告3例,\
2例来自刚果金,其余1例来自喀麦隆。新增出院1例。\
截至6月7日24时,全省累计报告新冠肺炎确诊病例2564例(境外输入1055例)。目前在院157例。"
text2 = text2*2**15
while(size2<1024):
print(text2,file=fp2)#将加密后的密文写入到c_rsa.txt文件中
fp2.close()
size2 = get_FileSize(filename_c2)
if(size2 > 0.9*1024):
print("1G Have finished 90%")
elif(size2 > 0.8*1024):
print("1G Have finished 80%")
elif(size2 > 0.7*1024):
print("1G Have finished 70%")
elif(size2 > 0.6*1024):
print("1G Have finished 60%")
elif(size2 > 0.5*1024):
print("1G Have finished 50%")
elif(size2 > 0.4*1024):
print("1G Have finished 40%")
elif(size2 > 0.3*1024):
print("1G Have finished 30%")
elif(size2 > 0.2*1024):
print("1G Have finished 20%")
elif(size2 > 0.1*1024):
print("1G Have finished 10%")
else:
pass
fp2 = open(filename_c2,"a",encoding="utf-8")
fp2.close()
except IOError:
print("%s文件打开失败" % filename_c2)
t3 = time.time()
print("1G完成时间:",t3-t2)
运行结果:
生成1M和1G文件:
(3)加密1M的txt文件
#用DES和RSA分别对1M文件进行加密
#des模式 填充方式 ECB加密方式
from pyDes import des, PAD_PKCS5, ECB
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
import time
#DES加密
def DES(m_file,c_file):#传入明文文件和密文文件名
# 秘钥
DES_SECRET_KEY = '12345678'
filename_m = m_file#明文的文件
filename_c = c_file#加密后的文件
try:
fp = open(filename_m,"r",encoding="utf-8")
print("%s 文件打开成功" % filename_m)
s = fp.read()
fp.close()
except IOError:
print("%s文件打开失败" % filename_m)
s = s.encode()
des_obj = des(DES_SECRET_KEY, ECB, DES_SECRET_KEY, padmode=PAD_PKCS5) # 初始化一个des对象,参数是秘钥,加密方式,偏移, 填充方式
secret_bytes = des_obj.encrypt(s) # 用对象的encrypt方法加密
#s = des_obj.decrypt(secret_bytes) # 用对象的decrypt方法解密
try:
fp2 = open(filename_c,"w",encoding="utf-8")
print("%s 文件打开成功=======DES加密后成功写入" % filename_c)
print(secret_bytes,file=fp2)#将加密后的密文写入到c.txt文件中
fp2.close()
except IOError:
print("%s文件打开失败" % filename_c)
#RSA加密
def my_RSA(m_file,c_file):#传入明文文件和密文文件名
filename_m = m_file#明文的文件
filename_c = c_file#加密后的文件
#生成公钥私钥
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
#使用公钥加密
try:
fp = open(filename_m,"r",encoding="utf-8")
print("%s 文件打开成功" % filename_m)
s = fp.read()
fp.close()
except IOError:
print("%s文件打开失败" % filename_m)
rsakey = RSA.importKey(open("public.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey) #创建用于执行pkcs1_v1_5加密或解密的密码
m = s.encode('utf-8')
c = []
for i in range(0,len(m),100):
cipher_text_temp = base64.b64encode(cipher.encrypt(m[i:i+100]))
#print(cipher_text_temp.decode('utf-8'))
c.append(cipher_text_temp.decode('utf-8')+"\n")
cipher_text = "".join(c)
try:
fp2 = open(filename_c,"a+",encoding="utf-8")
print("%s 文件打开成功=======RSA加密后成功写入" % filename_c)
print(cipher_text,file=fp2)#将加密后的密文写入到c_rsa.txt文件中
fp2.close()
except IOError:
print("%s文件打开失败" % filename_c)
t1 = time.time()
DES("m_1M.txt","c_des_1M.txt")
t2 = time.time()
my_RSA("m_1M.txt","c_rsa_1M.txt")
t3 = time.time()
print("DES_time:",t2-t1)
print("RSA_time:",t3-t2)
加密1M:
我们发现用DES加密的时间远比RSA加密的时间长
调试过程
1.用RSA加密时要注意就是编码问题,感觉还不是特别能深入理解
2.加密的时候文本不能太长,太长会报错,ValueError: Plaintext is too long.
之后,查找资料得到,单词加密串的长度最大为(key_size/8)-11,如果是1024bit的证书,最大长度可以认为是100,2048bit的证书。最大长度可以认为是200,
1024bit就是指的这个:
rsa = RSA.generate(1024, random_generator)
解密的时候也报错了,查找资料说是,本来应该也要分段解密,但是如果用的是base64.b64decode,那就不用,但是我自己实操的时候发现还是有错,所以还是尝试分段解密,但是我模仿之前的加密的方式的写法,还是报错,后面分别对加密的后的每一段进行解密,才没问题,否则只能解密第一句的内容。
3.文件被打开的时候无法用getsize获取文件的size,得到的会是0,必须是close以后,才能获取文件size的大小
更多推荐
用RSA算法加密文本文件
发布评论