用RSA算法加密文本文件

1 篇文章 0 订阅
1 篇文章 0 订阅

写文目的

当时参照网上其他文章写的,但是可能对编码不是很熟悉,然后就遇到各种错,感觉网上的文有的很杂很乱,举的例子也不好,文本太短了,根本没说到一些问题,希望能给别人一个解决的参照吧。

任务说明

编写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")

运行结果:
运行结果1-1
运行结果1-2
运行结果1-3

(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 = "670-24时,广东省新增10例本土确诊病例,广州报告;\
    另有本土无症状感染者转确诊病例9例,广州报告4例、深圳报告3例、\
    佛山和湛江各报告1例。\
  全省新增境外输入确诊病例3例,广州报告,分别来自柬埔寨、卡\
    塔尔和赞比亚。新增境外输入无症状感染者9例,广州报告5例,分别来自美国\
    、英国、柬埔寨、吉布提和布隆迪;佛山报告1例,来自法国;肇庆报告3例,\
    2例来自刚果金,其余1例来自喀麦隆。新增出院1例。\
  截至6724时,全省累计报告新冠肺炎确诊病例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 = "670-24时,广东省新增10例本土确诊病例,广州报告;\
    另有本土无症状感染者转确诊病例9例,广州报告4例、深圳报告3例、\
    佛山和湛江各报告1例。\
  全省新增境外输入确诊病例3例,广州报告,分别来自柬埔寨、卡\
    塔尔和赞比亚。新增境外输入无症状感染者9例,广州报告5例,分别来自美国\
    、英国、柬埔寨、吉布提和布隆迪;佛山报告1例,来自法国;肇庆报告3例,\
    2例来自刚果金,其余1例来自喀麦隆。新增出院1例。\
  截至6724时,全省累计报告新冠肺炎确诊病例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的大小

  • 4
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值