深入挖掘Python自定義加密算法的設(shè)計(jì)與實(shí)現(xiàn)
在正式編寫各種加解密前,我們先寫個小案例,如下。
基礎(chǔ)加解密-源碼
# 加密 def encode(): source01 = '樂茵' for c in source01: ascii01 = ord(c) ascii01 += 1 print(chr(ascii01), end='') # 解密 def decode(): source02 = '乑茶' for c in source02: ascii01 = ord(c) ascii01 -= 1 print(chr(ascii01), end='') if __name__ == '__main__': # encode() decode()
基礎(chǔ)加解密-源碼解析
這段代碼包含兩個函數(shù):encode() 和 decode(),以及一個主程序入口
encode() 函數(shù)
這個函數(shù)的作用是對字符串 "樂茵" 進(jìn)行加密。加密的方法是將每個字符的 ASCII 碼值加 1,然后將新的 ASCII 碼值轉(zhuǎn)換回字符。
定義一個字符串 source01,值為 "樂茵"。
使用 for 循環(huán)遍歷 source01 中的每個字符 c。
使用 ord() 函數(shù)獲取字符 c 的 ASCII 碼值,將其賦值給 ascii01。
將 ascii01 的值加 1。
使用 chr() 函數(shù)將新的 ASCII 碼值轉(zhuǎn)換回字符,并打印出來。注意這里使用 end='' 參數(shù),使得打印結(jié)果不換行。
decode() 函數(shù)
這個函數(shù)的作用是對字符串 "乑茶" 進(jìn)行解密。解密的方法是將每個字符的 ASCII 碼值減 1,然后將新的 ASCII 碼值轉(zhuǎn)換回字符。
定義一個字符串 source02,值為 "乑茶"。
使用 for 循環(huán)遍歷 source02 中的每個字符 c。
使用 ord() 函數(shù)獲取字符 c 的 ASCII 碼值,將其賦值給 ascii01。
將 ascii01 的值減 1。
使用 chr() 函數(shù)將新的 ASCII 碼值轉(zhuǎn)換回字符,并打印出來。注意這里使用 end='' 參數(shù),使得打印結(jié)果不換行。
主程序入口
在主程序入口中,調(diào)用 decode() 函數(shù)進(jìn)行解密操作。如果需要加密,可以取消 encode() 函數(shù)前的注釋,然后注釋掉 decode() 函數(shù)的調(diào)用。
這段代碼的主要作用是演示了一個簡單的字符加密和解密方法,即將每個字符的 ASCII 碼值加 1 或減 1。這種方法非常簡單,但安全性較低,不適用于實(shí)際的安全需求。
base64加解密-源碼
# base64加密 import base64 # 二進(jìn)制與十六進(jìn)制完全等價(jià)在計(jì)算機(jī)中,每四個二進(jìn)制位等于一個十六進(jìn)制位 source = 'echo' print(base64.b64encode(source.encode())) # base64解密 source = 'ZWNobw==' print(base64.b64decode(source.encode())) def decode(): de_source = 'ZWNobw==' print(base64.b64decode(de_source).decode()) # 對文件進(jìn)行編碼 def file_encode(): with open('文件引用/index.png', 'rb') as file: data = file.read() print(base64.b64encode(data).decode()) # 對base64還原成文件 def file_decode(): file_source = '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' data = base64.b64decode(file_source) with open('文件引用/index_1.png', 'wb') as file: file.write(data) if __name__ == '__main__': # file_encode() file_decode()
base64加解密-源碼解析
這段代碼主要演示了如何使用Python的base64庫進(jìn)行編碼和解碼操作
base64編碼部分
import base64 source = 'echo' print(base64.b64encode(source.encode()))
導(dǎo)入base64庫。
定義一個字符串source,值為'echo'。
使用base64.b64encode()函數(shù)對字符串進(jìn)行編碼。注意,b64encode需要接收字節(jié)類型的數(shù)據(jù),所以使用source.encode()將字符串轉(zhuǎn)換為字節(jié)。
打印編碼后的結(jié)果。
base64解碼部分
source = 'ZWNobw==' print(base64.b64decode(source.encode()))
定義一個字符串source,值為'ZWNobw==',這是'echo'的base64編碼結(jié)果。
使用base64.b64decode()函數(shù)對字符串進(jìn)行解碼。同樣地,需要先將字符串轉(zhuǎn)換為字節(jié)。
打印解碼后的結(jié)果。
decode函數(shù)
def decode(): de_source = 'ZWNobw==' print(base64.b64decode(de_source).decode())
這個函數(shù)與上面的解碼部分功能相同,但將解碼后的字節(jié)數(shù)據(jù)再轉(zhuǎn)換回字符串并打印。
file_encode函數(shù)
def file_encode(): with open('文件引用/index.png', 'rb') as file: data = file.read() print(base64.b64encode(data).decode())
打開一個名為'文件引用/index.png'的文件,并以二進(jìn)制模式讀取。
讀取文件內(nèi)容到data變量。
對文件內(nèi)容進(jìn)行base64編碼,并打印編碼后的結(jié)果。
file_decode函數(shù)
def file_decode(): file_source = 'iVBORw0KGgoAAAANSUhEUgAA...' data = base64.b64decode(file_source) with open('文件引用/index_1.png', 'wb') as file: file.write(data)
定義一個字符串file_source,值為一個很長的base64編碼字符串(這里省略了部分內(nèi)容)。
對該字符串進(jìn)行base64解碼,得到原始的二進(jìn)制數(shù)據(jù)。
打開一個名為'文件引用/index_1.png'的文件,并以二進(jìn)制模式寫入。
將解碼后的二進(jìn)制數(shù)據(jù)寫入文件。
主程序入口
if __name__ == '__main__': # encode() decode() # file_encode() file_decode()
主程序入口部分注釋了encode()和file_encode()函數(shù),只執(zhí)行了decode()和file_decode()函數(shù)。如果需要執(zhí)行編碼操作,可以取消相應(yīng)函數(shù)的注釋。
總結(jié):這段代碼主要演示了如何使用Python的base64庫對字符串和文件進(jìn)行編碼和解碼操作。
AES加解密-源碼
from Crypto.Cipher import AES from binascii import b2a_hex from binascii import a2b_hex # AES加密 source = 'kfc-v50' # 第一步,補(bǔ)足16位 # 如果source不足16位的倍數(shù)就用空格補(bǔ)足16位 if len(source.encode('utf-8')) % 16: add = 16 - (len(source.encode('utf-8')) % 16) else: add = 0 source = source + ('\0' * add) print(source) # 第二步,定義密鑰 # 定義偏移量,必須是16,24,32位 key = 'today-is-thursday-kfc-permit-v50'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF' cryptos = AES.new(key, mode, iv) cipher = b2a_hex(cryptos.encrypt(source.encode())) print(cipher.decode()) # AES解密 # cipher = '加密密文' key = 'today-is-thursday-kfc-permit-v50'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF' cryptos = AES.new(key, mode, iv) dest = cryptos.decrypt(a2b_hex(cipher)) print(dest.decode().rstrip('\0'))
AES加解密-源碼解析
這段代碼使用了Python的pycryptodome庫來實(shí)現(xiàn)AES加密和解密。以下是對代碼的詳細(xì)分析:
導(dǎo)入模塊
from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex
Crypto.Cipher.AES:提供了AES加密算法的實(shí)現(xiàn)。
binascii.b2a_hex 和 binascii.a2b_hex:用于在二進(jìn)制數(shù)據(jù)和十六進(jìn)制字符串之間進(jìn)行轉(zhuǎn)換。
AES加密部分
1. 數(shù)據(jù)預(yù)處理(填充)
source = 'kfc-v50' if len(source.encode('utf-8')) % 16: add = 16 - (len(source.encode('utf-8')) % 16) else: add = 0 source = source + ('\0' * add) print(source)
目的:確保明文長度是16字節(jié)的倍數(shù),因?yàn)锳ES是分組加密算法,要求數(shù)據(jù)長度必須是塊大?。?6字節(jié))的倍數(shù)。
步驟:
計(jì)算source字符串的字節(jié)長度。
判斷是否需要填充(即長度是否為16的倍數(shù))。
如果需要,計(jì)算需要填充的字節(jié)數(shù),并用\0(空字符)進(jìn)行填充。
輸出:填充后的字符串,例如'kfc-v50\0\0\0\0\0\0\0\0\0'。
2. 定義密鑰和初始化向量(IV)
key = 'today-is-thursday-kfc-permit-v50'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF'
密鑰(Key):必須是16、24或32字節(jié)長。這里使用的是32字節(jié)(256位)的密鑰。
模式(Mode):使用CBC(Cipher Block Chaining)模式,這是最常見的AES加密模式之一。
初始化向量(IV):16字節(jié)長,用于CBC模式中增加加密的隨機(jī)性。IV應(yīng)該是隨機(jī)生成的,但在示例中使用了固定的值。
3. 加密過程
cryptos = AES.new(key, mode, iv) cipher = b2a_hex(cryptos.encrypt(source.encode())) print(cipher.decode())
創(chuàng)建AES加密對象:使用指定的密鑰、模式和IV初始化AES加密器。
加密:將填充后的明文字符串編碼為字節(jié)并進(jìn)行加密。
轉(zhuǎn)換:將加密后的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制字符串,便于顯示和存儲。
輸出:加密后的十六進(jìn)制字符串,例如'e3b0c44298fc1c14...'。
AES解密部分
1. 定義密鑰和IV
key = 'today-is-thursday-kfc-permit-v50'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF'
解密時(shí)使用的密鑰、模式和IV必須與加密時(shí)完全相同。
2. 解密過程
cryptos = AES.new(key, mode, iv) dest = cryptos.decrypt(a2b_hex(cipher)) print(dest.decode().rstrip('\0'))
創(chuàng)建AES解密對象:同樣使用指定的密鑰、模式和IV初始化AES解密器。
解密:將十六進(jìn)制字符串轉(zhuǎn)換回二進(jìn)制數(shù)據(jù)并進(jìn)行解密。
去除填充:解密后的數(shù)據(jù)可能包含填充字符\0,使用rstrip('\0')去除這些字符,恢復(fù)原始明文。
輸出:解密后的原始字符串,例如'kfc-v50'。
注意事項(xiàng)
安全性:
固定IV:在實(shí)際應(yīng)用中,IV應(yīng)該是隨機(jī)生成的,并且每次加密時(shí)都不同。使用固定的IV會降低加密的安全性,特別是在處理大量數(shù)據(jù)時(shí)。
密鑰管理:確保密鑰的安全存儲和管理,避免泄露。
填充方式:
示例中使用了\0進(jìn)行填充,這種方式簡單但不夠通用。推薦使用標(biāo)準(zhǔn)的填充方案,如PKCS7填充,以確保兼容性和安全性。
異常處理:
代碼中沒有包含異常處理機(jī)制。在實(shí)際應(yīng)用中,應(yīng)添加適當(dāng)?shù)腻e誤處理,以應(yīng)對可能的異常情況(例如解密失敗、數(shù)據(jù)格式錯誤等)。
依賴庫:
確保安裝了pycryptodome庫,可以使用以下命令安裝:
pip install pycryptodome
總結(jié)
這段代碼展示了如何使用Python的pycryptodome庫進(jìn)行AES加密和解密操作。通過填充明文、定義密鑰和IV、執(zhí)行加密和解密步驟,實(shí)現(xiàn)了對稱加密的基本流程。然而,在實(shí)際應(yīng)用中,需要注意提高安全性和健壯性,例如使用隨機(jī)IV、采用標(biāo)準(zhǔn)填充方案以及添加異常處理。
RSA加解密—源碼
from binascii import b2a_hex from binascii import a2b_hex import rsa # 第一步,生成RSA公和私鑰 pub, priv = rsa.newkeys(256) # print(pub, priv) # 第二步,公鑰加密 encrypt = rsa.encrypt('leyinsec'.encode(), pub) enstr = b2a_hex(encrypt).decode() # print(enstr) # 第三步,私鑰解密 # decrypt = rsa.decrypt(encrypt, priv) decrypt = rsa.decrypt(a2b_hex(enstr), priv) print(decrypt.decode())
RSA加解密—源碼解析
這段代碼使用了Python的rsa庫和binascii庫來實(shí)現(xiàn)RSA公鑰加密和私鑰解密的過程
1. 導(dǎo)入庫
from binascii import b2a_hex from binascii import a2b_hex import rsa
binascii庫用于在二進(jìn)制和ASCII編碼之間轉(zhuǎn)換數(shù)據(jù)。
rsa庫用于實(shí)現(xiàn)RSA加密和解密。
2. 生成RSA公鑰和私鑰
pub, priv = rsa.newkeys(256)
使用rsa.newkeys()函數(shù)生成一對RSA公鑰和私鑰。
參數(shù)256表示密鑰的長度為256位。這是一個相對較短的密鑰長度,對于現(xiàn)代安全標(biāo)準(zhǔn)來說可能不夠安全。通常建議使用至少3072位的密鑰長度。
3. 公鑰加密
encrypt = rsa.encrypt('leyinsec'.encode(), pub) enstr = b2a_hex(encrypt).decode()
使用公鑰pub對字符串'leyinsec'進(jìn)行加密。注意,rsa.encrypt()函數(shù)需要字節(jié)類型的輸入,所以使用.encode()將字符串轉(zhuǎn)換為字節(jié)。
加密后的數(shù)據(jù)是二進(jìn)制格式,為了方便顯示或存儲,使用b2a_hex()函數(shù)將其轉(zhuǎn)換為十六進(jìn)制字符串。
4. 私鑰解密
decrypt = rsa.decrypt(a2b_hex(enstr), priv) print(decrypt.decode())
使用私鑰priv對加密后的數(shù)據(jù)進(jìn)行解密。由于加密后的數(shù)據(jù)是以十六進(jìn)制字符串形式存儲的,所以首先使用a2b_hex()函數(shù)將其轉(zhuǎn)換回二進(jìn)制格式。
解密后的數(shù)據(jù)是字節(jié)類型,使用.decode()將其轉(zhuǎn)換回字符串并打印出來。
注意事項(xiàng)
密鑰長度:如上所述,256位的RSA密鑰長度相對較短,可能不夠安全。建議使用更長的密鑰長度,如3072位或更長。
填充方案:RSA加密通常使用某種填充方案(如PKCS#1 v1.5或OAEP)。在上述代碼中,沒有明確指定填充方案,因此rsa庫可能會使用默認(rèn)的填充方案。在實(shí)際應(yīng)用中,建議明確指定填充方案以確保安全性。
錯誤處理:上述代碼沒有包含任何錯誤處理邏輯。在實(shí)際應(yīng)用中,應(yīng)該添加適當(dāng)?shù)腻e誤處理來捕獲和處理可能發(fā)生的異常,如解密失敗、無效的輸入等。
安全性:RSA加密雖然強(qiáng)大,但也有其局限性。它主要用于加密小量數(shù)據(jù)或用于安全地交換對稱加密密鑰。對于大量數(shù)據(jù)的加密,通常建議使用對稱加密算法,如AES,并使用RSA來安全地交換對稱密鑰。
以上就是深入挖掘Python自定義加密算法的設(shè)計(jì)與實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Python自定義加密算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python如何實(shí)現(xiàn)網(wǎng)絡(luò)自動化運(yùn)維華為設(shè)備
本文介紹了如何使用Python實(shí)現(xiàn)華為設(shè)備的網(wǎng)絡(luò)自動化運(yùn)維,包括環(huán)境配置、設(shè)備配置、功能模塊實(shí)現(xiàn)和SFTP文件傳輸測試2024-11-11filter使用python3代碼進(jìn)行迭代元素的實(shí)例詳解
在本篇文章里小編給大家整理了關(guān)于filter使用python3代碼進(jìn)行迭代元素的實(shí)例詳解內(nèi)容,有興趣的朋友們可以參考下。2020-12-12python XlsxWriter模塊創(chuàng)建aexcel表格的實(shí)例講解
今天小編就為大家分享一篇python XlsxWriter模塊創(chuàng)建aexcel表格的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置
我們在用matplotlib繪制圖的時(shí)候總是有各種需求,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04教你使用Python的pygame模塊實(shí)現(xiàn)拼圖游戲
pygame模塊是一個可以跨平臺的模塊,其設(shè)計(jì)目的就是為電子游戲而設(shè)計(jì),能夠支持圖片和聲音,下面這篇文章主要給給大家介紹了關(guān)于使用Python的pygame模塊實(shí)現(xiàn)拼圖游戲的相關(guān)資料,需要的朋友可以參考下2022-07-07flask中使用SQLAlchemy進(jìn)行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)2013-02-02Python連接Mysql實(shí)現(xiàn)圖書借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python連接Mysql實(shí)現(xiàn)圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03python基于event實(shí)現(xiàn)線程間通信控制
這篇文章主要介紹了python基于event實(shí)現(xiàn)線程間通信控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01