日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python 實現RSA加解密文本文件

瀏覽:19日期:2022-06-30 17:52:41

近來在使用python寫項目,特此記錄一下項目中遇到的文件加解密問題。關于python版本的加密算法,隨便搜一搜還是可以檢索出來很多的,不過大都是同一篇文章在不同的平臺來回發布,或者就是轉載,而且例舉的都是最簡單的情況,那么,實際項目中使用的話,肯定會比這個要稍微復雜一些,比如我的需求就是要加密一個使用mysqldump出來的數據庫腳本文件,直接拿網上的例子過來調用肯定是不行的,所以不得不自己研究了一番,特此記錄。

RSA算法什么是RSA算法?

項目選型的算法是RSA非對稱加密算法,關于這個算法不做過多的解釋,咱們劃重點:

公鑰用于加密 私鑰用于解密 len_in_byte(raw_data) = len_in_bit(key)/8 -11,如 1024bit 的密鑰,一次能加密的內容長度為 1024/8 -11 = 117 byte為何要減去11個byte?

因為我們使用的是PKCS1Padding占用了11個byte,那么它能加密的明文長度就必須減去這11個byte

可能會遇到什么問題?

基于以上三點,我們大概可以知道要完成文件加解密,我們可能會遇到什么問題?

一次性加密明文的長度是和密鑰長度有關系的,那么我們要加密一個文件,不能一次性將文本內容讀取出來,然后加密如果文件很大,我們也不可能將文件內容一次性讀取到內存當中,可能會直接導致服務器無法響應其他請求,這肯定是不合理的文本被加密之后,回頭解密,如果讀取的長度有差異勢必導致解密失敗,那么這個數據庫備份文件就廢了,這個就比較危險了

Do It

安裝依賴,python版本3.7.4

pip install pycryptodomex -i https://pypi.tuna.tsinghua.edu.cn/simple/

導入模塊:

import base64from Cryptodome import Randomfrom Cryptodome.PublicKey import RSAfrom Cryptodome.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5from Cryptodome.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5

生成公鑰+私鑰,注意這里我們生成的公鑰長度是1024bit

# 偽隨機數生成器random_generator = Random.new().read# rsa算法生成實例rsa = RSA.generate(1024, random_generator)private_pem = str(rsa.exportKey(), encoding='utf-8')with open('client-private.pem', 'w') as f: f.write(private_pem) public_pem = str(rsa.publickey().exportKey(), encoding='utf-8')with open('client-public.pem', 'w') as f: f.write(public_pem)’’’

加密,這里對傳入的明文長度做了切分,因為我們生成的密鑰長度為1024bit,所以我們一次加密的明文長度不能超過117個byte

def rsa_encrypt(plaintext, pub_key): ’’’ rsa 加密 :param plaintext: 明文 :param pub_key:公鑰 ’’’ message = plaintext.encode('utf-8') length = len(message) default_length = 117 # 1024/8 - 11 1024為密鑰長度 rsakey = RSA.importKey(pub_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 不需要切分 if length <= default_length:return default_rsa_encrypt(cipher, message) # 需要切分 offset = 0 result = [] while length - offset > 0:if length - offset > default_length: result.append(default_rsa_encrypt(cipher, message[offset:offset+default_length]))else: result.append(default_rsa_encrypt(cipher, message[offset:]))offset += default_length return 'n'.join(result) def default_rsa_encrypt(cipher, message): ciphertext = base64.b64encode(cipher.encrypt(message)) # print(b'ciphertext:'+ciphertext) ciphertext_decode = ciphertext.decode('utf-8') # print('ciphertext_decode:'+ciphertext_decode) return ciphertext_decode

解密

def rsa_decrypt(ciphertext, priv_key): ’’’ rsa 解密 :param ciphertext:密文 :param priv_key:私鑰 ’’’ message = base64.b64decode(ciphertext) length = len(message) default_length = 128 rsakey = RSA.importKey(priv_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) if length <= default_length:return default_rsa_decrypt(cipher, message) # 需要分段 offset = 0 result = [] while length - offset > 0:if length - offset > default_length: result.append(rsa_decrypt(cipher, message[offset:offset+default_length]))else: result.append(rsa_decrypt(cipher, message[offset:]))offset += default_length decode_message = [x.decode('utf-8') for x in result] return ''.join(decode_message) def default_rsa_decrypt(cipher, message): plaintext = cipher.decrypt(message, random_generator) # print(b'plaintext:'+plaintext) plaintext_decode = plaintext.decode('utf-8') # print('plaintext_decode:'+plaintext_decode) return plaintext_decode

加解密文件,考慮開頭我們提出的問題,采用了逐行讀取,逐行加密,加密后密文也逐行寫入

def rsa_encrypt_file(file_path, save_path, pub_key): ’’’ rsa 加密文件 :param file_path:需要加密文件路徑 :param save_path:加密之后存放的文件路徑 :param pub_key:公鑰 ’’’ with open(file_path, 'r', encoding='utf-8') as f:line = f.readline() # 讀取一行while line: context = rsa_encrypt(line, pub_key) # 加密切割后的字符 with open(save_path, 'a', encoding='utf-8') as w:w.write(context+'n')line = f.readline()def rsa_decrypt_file(file_path,save_path,priv_key): ’’’ rsa 解密文件 :file_path:需要解密的文件路徑 :save_path:解密之后存放的文件路徑 :priv_key:私鑰 ’’’ with open(file_path,'r',encoding='utf-8') as f:line = f.readline()while line: context = rsa_decrypt(line.strip('n'),priv_key) with open(save_path,'a',encoding='utf-8') as w:w.write(context) line = f.readline()

測試,一開始我使用的是自己隨便輸入的一行很長的數字文本,親測沒有問題,但是當我直接使用我的數據庫腳本文件的時候,加密可以成功,但是會遇到解密后解碼失敗的情況,當時百思不得其解,我以為是字符集的問題,于是我將utf-8,換成了gb2312,加解密成功了,當時心花怒放,直到我重新加解密了另一個備份文件,又遇到解碼失敗,當時就睡不著覺了~

直到我看到了這句話不完整的多字節序列(incomplete multibyte sequence)我瞬間明白了,因為我的腳本文件中含有中文,utf8 編碼一個漢字是3個byte,gb2312編碼一個漢字是2個byte,只要是多字節,那么做切割的時候,就有可能一個漢字被切割成了兩部分,那么自然會導致無法解碼成正確的漢字了,問題已經明了,就看怎么解決了。

因為是腳本文件,處理不好就有可能導致腳本執行失敗,最終導致數據庫還原失敗,這就違背項目初衷了~

所以我想了一個辦法,先對每一行文本做字符編碼判斷,超過了117,最后一個字符就不累計上去,代碼如下:

def cut_string(message,length = 117): result = [] temp_char = [] for msg in message:#遍歷每一個字符msg_encode = msg.encode('utf-8')#對每一個字符編碼temp_encode = ''.join(temp_char).encode('utf-8')#累計編碼之后的字節數if len(temp_encode) + len(msg_encode) <= length:#如果小于約定的長度,加添加入結果集 temp_char.append(msg)else:#如果已經超過了約定的長度,就添加入下一個結果集 result.append(''.join(temp_char)) temp_char.clear() temp_char.append(msg) result.append(''.join(temp_char)) return result

加密方法需要重新調整一下:

def rsa_encrypt_file(file_path,save_path,pub_key): ’’’ rsa 加密文件 :param file_path:需要加密文件路徑 :param save_path:加密之后存放的文件路徑 :param pub_key:公鑰 ’’’ with open(file_path,'r',encoding='utf-8') as f:line = f.readline() #讀取一行while line: cut_lines = cut_string(line) # 切割字符 保證漢字不被切割 for cut_line in cut_lines:context = rsa_encrypt(cut_line,pub_key) #加密切割后的字符with open(save_path,'a',encoding='utf-8') as w: w.write(context+'n') line = f.readline()

到此問題就已經解決了,其實有了這個cut_string方法之后,之前寫的加解密方法中不需要再做切分,但是代碼保留。

上面的方法,加解密的效率非常的低,因為是逐行加解密,一個300M的腳本文件,加密完成耗時40分鐘,這個實在是太難受了,所以調整了策略,先壓縮再加密,所以就涉及到二進制文件的讀取與寫入,最后的實現代碼如下:

def rsa_encrypt_binfile(file_path,save_path,pub_key): ’’’ rsa 加密二進制文件 :param file_path:需要加密文件路徑 :param save_path:加密之后存放的文件路徑 :param pub_key:公鑰 ’’’ with open(file_path, ’rb’) as f: message = f.read() length = len(message) default_length = 117 # 1024/8 - 11 1024為密鑰長度 rsakey = RSA.importKey(pub_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 不需要切分 result = [] if length <= default_length: result.append(base64.b64encode(cipher.encrypt(message))) # 需要切分 offset = 0 while length - offset > 0: if length - offset > default_length: result.append(base64.b64encode(cipher.encrypt(message[offset:offset+default_length]))) else: result.append(base64.b64encode(cipher.encrypt(message[offset:]))) offset += default_length with open(save_path,'ab+') as w: for ciphertext in result: ciphertext += b'n' w.write(ciphertext)

def rsa_decrypt_binfile(file_path,save_path,priv_key): ’’’ rsa 解密二進制文件 :file_path:需要解密的文件路徑 :save_path:解密之后存放的文件路徑 :priv_key:私鑰 ’’’ with open(file_path,'rb') as f: line = f.readline() while line: message = base64.b64decode(line.strip(b'n')) rsakey = RSA.importKey(priv_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) plaintext = cipher.decrypt(message, random_generator) with open(save_path, ’ab+’) as w: #追加寫入w.write(plaintext) line = f.readline()

以上就是Python 實現RSA加解密文本文件的詳細內容,更多關于python rsa加解密的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
深夜福利一区| 色婷婷久久久| 日本aⅴ精品一区二区三区| 午夜精品一区二区三区国产| 99视频一区| 日本久久二区| 成人在线超碰| 亚洲精品1区| 国产日韩欧美一区二区三区在线观看| 久久99国产精品视频| 神马午夜久久| 综合国产视频| 开心激情综合| 欧美午夜精彩| 日韩一二三区在线观看| 日韩激情啪啪| 精品久久久中文字幕| 91精品综合| 亚洲精品动态| 麻豆理论在线观看| 在线精品一区| 国产成人久久精品麻豆二区 | 91成人精品视频| 亚洲免费激情| 国产欧美亚洲精品a| 中文字幕在线视频久| 天堂av在线一区| 久久精品九色| 成人久久久久| 日本成人在线不卡视频| 日韩在线短视频| 欧美视频久久| 亚洲国产一区二区三区在线播放| 国产探花一区在线观看| 欧美日韩中文字幕一区二区三区| 青草久久视频| 影音先锋久久| 日本久久综合| 日韩精品一区二区三区av| 理论片午夜视频在线观看| 亚洲精品视频一二三区| 99久久99视频只有精品| 国产探花在线精品| 蜜桃国内精品久久久久软件9| 欧美日韩黄网站| 在线综合欧美| av资源中文在线| 国产日韩精品视频一区二区三区| 国产综合婷婷| 精品黄色一级片| 日本少妇一区二区| 午夜欧美视频| 国产精品毛片久久| 国产毛片久久久| 蜜桃视频在线观看一区二区| 色一区二区三区| 国产日韩欧美一区在线| 蜜桃视频一区二区三区在线观看| 国产一区二区三区免费在线| 日韩精品一级| 午夜在线精品偷拍| 欧美一区二区三区高清视频| 精品视频国内| 国产精品一区高清| 蜜臀精品久久久久久蜜臀| 日韩视频网站在线观看| 精品美女视频 | 先锋影音久久久| 亚洲五月婷婷| 久久久久久久久久久9不雅视频| 麻豆久久久久久| 精品久久久网| 欧美国产先锋| 国产情侣一区在线| 欧美日韩亚洲一区在线观看| 午夜亚洲精品| 国产模特精品视频久久久久| 欧美日韩水蜜桃| 午夜影院一区| 亚洲人成在线网站| 蜜桃精品在线| 亚洲成av人片一区二区密柚| 蜜桃视频在线网站| 日韩成人三级| 日韩欧美1区| 色偷偷色偷偷色偷偷在线视频| 久久亚洲黄色| 精品在线网站观看| 91免费精品| 天堂av在线| 国产精品7m凸凹视频分类| 99久精品视频在线观看视频| 久久久久亚洲| 黄色成人精品网站| 中文字幕日韩欧美精品高清在线| 亚洲精品自拍| 欧美日一区二区在线观看| 国产欧美69| 高清不卡一区| 91精品国产乱码久久久久久久| 99久久激情| 五月天激情综合网| 免费久久精品视频| 91嫩草精品| 久久不见久久见中文字幕免费| 国产成人精品亚洲线观看| 黄色在线网站噜噜噜| 午夜免费一区| 日产欧产美韩系列久久99| 国产精品大片| 日产精品一区| 久久成人国产| 国产视频一区二| 91综合视频| 午夜影院欧美| 日本视频一区二区| 鲁大师精品99久久久| 神马久久午夜| 另类激情亚洲| 国产精品tv| 日本久久成人网| 免费在线成人网| 国产欧美一区二区三区国产幕精品| 久久亚洲资源中文字| 蜜桃tv一区二区三区| 日本不卡视频一二三区| 给我免费播放日韩视频| 国产亚洲激情| 国产精品任我爽爆在线播放| 桃色一区二区| 综合国产在线| 精品免费视频| 模特精品在线| 精品久久网站| 免费美女久久99| 国产精品蜜芽在线观看| 久久亚洲风情| 国产成人精品亚洲线观看| 首页国产欧美日韩丝袜| 麻豆一区二区三区| 夜夜嗨一区二区| 久久精品二区亚洲w码| 欧美精品一区二区久久| 久久精品99国产精品日本| 波多视频一区| 久久国际精品| 久久国产电影| 国产精品一区三区在线观看| 国内精品福利| 精品精品国产三级a∨在线| 亚洲一区有码| 不卡福利视频| 国产精品三p一区二区| 亚洲国产一区二区三区在线播放| 欧美国产精品| 亚洲日本免费电影| 久久久一本精品| 国产欧美另类| 男女精品网站| 欧美日韩尤物久久| 久久在线91| 亚洲乱码一区| 亚洲第一精品影视| 成人黄色av| 久久国产精品免费精品3p| 午夜一区在线| 韩日一区二区三区| 欧美日韩在线观看首页| 欧美国产另类| 日本少妇一区二区| 一二三区精品| 影院欧美亚洲| 免费国产自久久久久三四区久久| 精品丝袜久久| 欧美激情精品| 欧美在线精品一区| 久久xxxx精品视频| 香蕉国产精品| 国产精品av久久久久久麻豆网| 国产一区二区三区久久| 国产精品香蕉| 欧美日韩1区| 日本精品国产| 亚洲日产国产精品| 国产偷自视频区视频一区二区| 在线一区视频观看| 精品欠久久久中文字幕加勒比| 国产精品亚洲片在线播放| 日韩高清一区| 亚洲精品婷婷| 日本不卡视频在线观看| 欧美中文字幕| 亚洲一区二区三区四区五区午夜| 国产99精品| 激情综合网站| 9色国产精品| 蜜桃视频一区二区三区在线观看| 亚洲综合国产| 久久亚洲电影| 亚洲18在线|