深入挖掘Python自定義加密算法的設計與實現(xiàn)
在正式編寫各種加解密前,我們先寫個小案例,如下。
基礎加解密-源碼
# 加密 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()
基礎加解密-源碼解析
這段代碼包含兩個函數(shù):encode() 和 decode(),以及一個主程序入口
encode() 函數(shù)
這個函數(shù)的作用是對字符串 "樂茵" 進行加密。加密的方法是將每個字符的 ASCII 碼值加 1,然后將新的 ASCII 碼值轉換回字符。
定義一個字符串 source01,值為 "樂茵"。
使用 for 循環(huán)遍歷 source01 中的每個字符 c。
使用 ord() 函數(shù)獲取字符 c 的 ASCII 碼值,將其賦值給 ascii01。
將 ascii01 的值加 1。
使用 chr() 函數(shù)將新的 ASCII 碼值轉換回字符,并打印出來。注意這里使用 end='' 參數(shù),使得打印結果不換行。
decode() 函數(shù)
這個函數(shù)的作用是對字符串 "乑茶" 進行解密。解密的方法是將每個字符的 ASCII 碼值減 1,然后將新的 ASCII 碼值轉換回字符。
定義一個字符串 source02,值為 "乑茶"。
使用 for 循環(huán)遍歷 source02 中的每個字符 c。
使用 ord() 函數(shù)獲取字符 c 的 ASCII 碼值,將其賦值給 ascii01。
將 ascii01 的值減 1。
使用 chr() 函數(shù)將新的 ASCII 碼值轉換回字符,并打印出來。注意這里使用 end='' 參數(shù),使得打印結果不換行。
主程序入口
在主程序入口中,調用 decode() 函數(shù)進行解密操作。如果需要加密,可以取消 encode() 函數(shù)前的注釋,然后注釋掉 decode() 函數(shù)的調用。
這段代碼的主要作用是演示了一個簡單的字符加密和解密方法,即將每個字符的 ASCII 碼值加 1 或減 1。這種方法非常簡單,但安全性較低,不適用于實際的安全需求。
base64加解密-源碼
# base64加密 import base64 # 二進制與十六進制完全等價在計算機中,每四個二進制位等于一個十六進制位 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()) # 對文件進行編碼 def file_encode(): with open('文件引用/index.png', 'rb') as file: data = file.read() print(base64.b64encode(data).decode()) # 對base64還原成文件 def file_decode(): file_source = 'iVBORw0KGgoAAAANSUhEUgAAAJEAAAAyCAIAAADTMq40AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJ4klEQVR4nO1cb2hVyRU/yTPhxecftm5fStGKT0y0ouCDlYBs6YfgHxSRKkUwdRE/3LgxqUleiAZ2CUl3SalNCFmNV7D4wWDFWFTIC42i1hg/CCbuh4LbliSLSuRus2ii9fLiS/ph9O5k/pyZufe9aKG/T7nz55wzc86ZOXNmXnJmZmbg//ifQu67FiCTcNy57vhOMO9dC5AZvG+T7skTDRv3UnZR6MxxWRKXL1/u7e1Vsu/s7MzN1XJinoUP6FAwncfgguHdcfqyWseFHOF+RobX132uv7/fTMzZsG0bkYAUyqoA3tSCobXywLXFCOB98oLRwiBzqiMwPUB9OqRQ7Gef/dZS8DRENAyWNYvmwkWLa2uquwcGduzYASAdoqe2gNxxkIlLJBKTk5N0uWdzfHtTXowOlCIJG5BCsZ8x8+sb9Jj1aYZCoZKSku3bty9ZskTYAFlV/G0kiHjxeDz4bGRktfBIzaM/MkXXg2VZRG1GvpJOpwcGBgYGBujChQsXHj9+nC6RrV0gGsWjR4+WLVsmZOe4kO8+kwkzODioKTYiGFArqlA8ryOo1l6g10avheb8bty48eDBg3SJzB4zEmVMTk569IkdyOZFJkxFRcX69euFxOvr6xHWlmU1t4s5yvD4JeSHBCshvqHStTJe0TC3n5H+sVhseHiYqWLk5lX7WavdUl85NZXi2cwN8EUsmUwKdaYjXnNdZUdHB12CGGK2x8uG44RfZWWlUBTcF/ND8NVXHYKK9wMjIyOaLW3bZqKPVOqNIZKB88N3XP+xkr6OCRdx3Dh//nxTxnhc8Le+pClBBIw/tbW1+RBYhuZ2m4zFtm2Z4wqXZX2dKTcL2cZMPn3mQYzcPxqGW3/toUtaW1sjkYjjwp//ZP/9a+NNnkF1dTXI43Il7t27R3/KhkbiKWTgzCFPRlBHtci5DYx05jhONBpF2Ajx+CUsjcDr16/pwkgkQrr86hOrKkKxcCEahuHh4bt37/b39+/evbunp8d1tQyYzKmPuPzMmTN4A01r0DyBaZo70sxAZx0dHc3NzXibiooKpiQ/JG3suGwtETQWi8VisbKyMgDYvHkzqdJRRqaOlR6MfJdeHnmfy2BgItCZzHkdx8FpCacMkTWVhqURaa2SckbADLaoqCgINX++ZXoWkvrZjz788ff//g7v3NnZ+eDBA6QBbqdEYUozFCps56/3fbTpF9EwNDY2jo2N4XJ6eP78+eLFi+kShu+RI0c0Sel7j04iWFNtpJlAZ6Tzb6zK9i8+Z6qyYe+4rDzHdevWHT582PtsbGzUF6y3t3fv3r1Ig/GpUDT0A7W8vHzk9CJMbesvHh4F02VTel3y858VmlHioL91y1bj69ev84W0wkx53bx5E2+QSs9S/9RUqq+vT9hSlsNF9m8a+HlOVkuYZv6euqCggD+TIqCP6gwuXrzIlCBk/cX64+Pj9OeXdZ8yDS5duvS7lt8LD9FC+AgLeVLInEA2dPbq1StlG8uyuru7mULGuHyswz7U1tDQQH+m02m+zaMRNo0HmYgD9e9laDhudt6DWJZ15coVj4cQ165ds95iYmICVMaliXnzsvJaQnahyIzOMzujPBZtrPyqyJSwMYhOLMTY8uDgoNC6k8lkMpm0bTuVBseF2Kri4X9+I6NZV1fn/Z2Tk7N161ad5wtCnDhxImCg1Nz+Jtnhg46/i3U8nc+volI/c1wIFxQo+cXjcWRFsiyL7Mm//HiTkhTBzMyMb4Xp4MaNG97fT548YWqR7BRy+hRmqrL3rGiWzpjVqUqU3RcCURuhuWbNGl/isbh16xaopmP58uVI7YULF7y/m5qaAspDFi7kHYBOdyNEw+h+tnLlSn1aMrUR81y0aJGRZDKcP3+e/IEMdd++fQiFLVu2yKrIBSEOhm/APZi53sL15xmHVGeaZkIDVxuNPXv22LYdi8XUPMxRUIj5WVG8RFYVMKmBQN+fHr+Exy8VbXI9ogFBKNTW1gpr29ra6M87d+4AQH19PTnJbdqku9sR4NYdDYPsDQEARH/yU/IHcwV69OhRIxloKFXCCCxs77WRnco9CrnMtxKnTp0C0TpO/i4qKiouLuZ7PXz4kP58+vQp/bl//377LcJhhSjT09NKIUtLS2VVnswtLS10+YoVK5RkEZqmgaKs/dKIOqFsfD4bGhoCVMc1NTU5OTmmZD20t7c3t9vIRd3p06eVRIR2kynoLHTK1JRv1qDMgyCzL8yQEhBfDALkoo4YTbbB5EcAoHjtOngbCCi9CnlmgdQi8BY2RdwIGudKQos3HN83/aAxpGfPxM8RPTHu37/vmzsAfPv9f5g8JADUVB3Wkc2DbAPTT13y0PKzDRs2KAml3qbomPEEURveHX+OCBrrZyKRYEqIdSYSCcuyvjxWzXcRzqzmdHuuyfuozs2Z52H+8/q0b0XD0usix4Xmdi+2YBXQ8oc/KhkdOHBAViW859TPOR07dowvtCyLea/vATGggCF3SpCUxiCOQTQjV5JI1BTo3LlzTNXIv/5BEsRI95IS6VmqsbHx7NmzdMnQ0JCS4Nq1a8kfsl8CCCF7tgyiIJ4HPp8ksldOuIdUmvqNBf3+hHZYehZWr15dWVmpnzv36OjYvv6RXAfCN1jbtm3btWsX+Xt6evrQoUO+paKBPxHQiTv0V0jgfxfjPTQ3jXBwrkbzHgqFTp48SZdozi/TnWfKK6C8vFz2i3LLsuLxuA5H/bnKyBusNzrjaRlRxxvTtdPT011dXSQPoommpqbCwkIA6OnpuXr1Kt6Y/hkOf+mFO43runl5eaFQCEzeQvEtM/44jsEPOgvOwwcRx4W/nD2lf+TyJr2hoYEOx4XK0PEzmVQQYNL9TaZ+L/FvBjMOWiBEOOUSqozfaMoMNfyHwgjZrCrABx1WZ6Yv7mQt6RlkrgR1KA9+M2K3tvDlpaWlY2NjVVVVExMTo6Ojo6OjO3fuFFJgFJZIJFatWiWT9r0FY4hE+Fk6Q9YEWZXjQio96/dxsvZBJgv3P8+BamtrX7x4wTeo+fyLD5Z86PsaJbM6Dr7bzdHaaATZqMbHx/k0oBIB97CMhxiO6t0qIgkp96Mzj6vv44iQJvOSwveeR1BWVlb80cdKSWRDQHo5LrhpCHNLS0ZAxi5TqmBt1KdLEhzkDE/PNVknIZjOdBp0dXXdvn2bbrBgwYLy8nJv0/Ihg74wzM+l5xgGOuPDCt4csn1moEMkYjcyewRu6/bNdO7hyP/bDczxfqbpTEGSPZrLdVZj8Tk6U2tKwzSAzElmmnYJcsCiM6sBoYwXNMuN4F9nwi4ygYxcJ7gT6JDSz7dpdjFlgXdEegV6K8d3kVmWkqBvPTE3Hfq3WUJp6VrTLr7b8zIj0wgA/wUFnPmH2GVRJAAAAABJRU5ErkJggg==' 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庫進行編碼和解碼操作
base64編碼部分
import base64 source = 'echo' print(base64.b64encode(source.encode()))
導入base64庫。
定義一個字符串source,值為'echo'。
使用base64.b64encode()函數(shù)對字符串進行編碼。注意,b64encode需要接收字節(jié)類型的數(shù)據(jù),所以使用source.encode()將字符串轉換為字節(jié)。
打印編碼后的結果。
base64解碼部分
source = 'ZWNobw==' print(base64.b64decode(source.encode()))
定義一個字符串source,值為'ZWNobw==',這是'echo'的base64編碼結果。
使用base64.b64decode()函數(shù)對字符串進行解碼。同樣地,需要先將字符串轉換為字節(jié)。
打印解碼后的結果。
decode函數(shù)
def decode(): de_source = 'ZWNobw==' print(base64.b64decode(de_source).decode())
這個函數(shù)與上面的解碼部分功能相同,但將解碼后的字節(jié)數(shù)據(jù)再轉換回字符串并打印。
file_encode函數(shù)
def file_encode(): with open('文件引用/index.png', 'rb') as file: data = file.read() print(base64.b64encode(data).decode())
打開一個名為'文件引用/index.png'的文件,并以二進制模式讀取。
讀取文件內容到data變量。
對文件內容進行base64編碼,并打印編碼后的結果。
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編碼字符串(這里省略了部分內容)。
對該字符串進行base64解碼,得到原始的二進制數(shù)據(jù)。
打開一個名為'文件引用/index_1.png'的文件,并以二進制模式寫入。
將解碼后的二進制數(shù)據(jù)寫入文件。
主程序入口
if __name__ == '__main__': # encode() decode() # file_encode() file_decode()
主程序入口部分注釋了encode()和file_encode()函數(shù),只執(zhí)行了decode()和file_decode()函數(shù)。如果需要執(zhí)行編碼操作,可以取消相應函數(shù)的注釋。
總結:這段代碼主要演示了如何使用Python的base64庫對字符串和文件進行編碼和解碼操作。
AES加解密-源碼
from Crypto.Cipher import AES from binascii import b2a_hex from binascii import a2b_hex # AES加密 source = 'kfc-v50' # 第一步,補足16位 # 如果source不足16位的倍數(shù)就用空格補足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庫來實現(xiàn)AES加密和解密。以下是對代碼的詳細分析:
導入模塊
from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex
Crypto.Cipher.AES:提供了AES加密算法的實現(xiàn)。
binascii.b2a_hex 和 binascii.a2b_hex:用于在二進制數(shù)據(jù)和十六進制字符串之間進行轉換。
AES加密部分
1. 數(shù)據(jù)預處理(填充)
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ù),因為AES是分組加密算法,要求數(shù)據(jù)長度必須是塊大?。?6字節(jié))的倍數(shù)。
步驟:
計算source字符串的字節(jié)長度。
判斷是否需要填充(即長度是否為16的倍數(shù))。
如果需要,計算需要填充的字節(jié)數(shù),并用\0(空字符)進行填充。
輸出:填充后的字符串,例如'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模式中增加加密的隨機性。IV應該是隨機生成的,但在示例中使用了固定的值。
3. 加密過程
cryptos = AES.new(key, mode, iv) cipher = b2a_hex(cryptos.encrypt(source.encode())) print(cipher.decode())
創(chuàng)建AES加密對象:使用指定的密鑰、模式和IV初始化AES加密器。
加密:將填充后的明文字符串編碼為字節(jié)并進行加密。
轉換:將加密后的二進制數(shù)據(jù)轉換為十六進制字符串,便于顯示和存儲。
輸出:加密后的十六進制字符串,例如'e3b0c44298fc1c14...'。
AES解密部分
1. 定義密鑰和IV
key = 'today-is-thursday-kfc-permit-v50'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF'
解密時使用的密鑰、模式和IV必須與加密時完全相同。
2. 解密過程
cryptos = AES.new(key, mode, iv) dest = cryptos.decrypt(a2b_hex(cipher)) print(dest.decode().rstrip('\0'))
創(chuàng)建AES解密對象:同樣使用指定的密鑰、模式和IV初始化AES解密器。
解密:將十六進制字符串轉換回二進制數(shù)據(jù)并進行解密。
去除填充:解密后的數(shù)據(jù)可能包含填充字符\0,使用rstrip('\0')去除這些字符,恢復原始明文。
輸出:解密后的原始字符串,例如'kfc-v50'。
注意事項
安全性:
固定IV:在實際應用中,IV應該是隨機生成的,并且每次加密時都不同。使用固定的IV會降低加密的安全性,特別是在處理大量數(shù)據(jù)時。
密鑰管理:確保密鑰的安全存儲和管理,避免泄露。
填充方式:
示例中使用了\0進行填充,這種方式簡單但不夠通用。推薦使用標準的填充方案,如PKCS7填充,以確保兼容性和安全性。
異常處理:
代碼中沒有包含異常處理機制。在實際應用中,應添加適當?shù)腻e誤處理,以應對可能的異常情況(例如解密失敗、數(shù)據(jù)格式錯誤等)。
依賴庫:
確保安裝了pycryptodome庫,可以使用以下命令安裝:
pip install pycryptodome
總結
這段代碼展示了如何使用Python的pycryptodome庫進行AES加密和解密操作。通過填充明文、定義密鑰和IV、執(zhí)行加密和解密步驟,實現(xiàn)了對稱加密的基本流程。然而,在實際應用中,需要注意提高安全性和健壯性,例如使用隨機IV、采用標準填充方案以及添加異常處理。
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庫來實現(xiàn)RSA公鑰加密和私鑰解密的過程
1. 導入庫
from binascii import b2a_hex from binascii import a2b_hex import rsa
binascii庫用于在二進制和ASCII編碼之間轉換數(shù)據(jù)。
rsa庫用于實現(xiàn)RSA加密和解密。
2. 生成RSA公鑰和私鑰
pub, priv = rsa.newkeys(256)
使用rsa.newkeys()函數(shù)生成一對RSA公鑰和私鑰。
參數(shù)256表示密鑰的長度為256位。這是一個相對較短的密鑰長度,對于現(xiàn)代安全標準來說可能不夠安全。通常建議使用至少3072位的密鑰長度。
3. 公鑰加密
encrypt = rsa.encrypt('leyinsec'.encode(), pub) enstr = b2a_hex(encrypt).decode()
使用公鑰pub對字符串'leyinsec'進行加密。注意,rsa.encrypt()函數(shù)需要字節(jié)類型的輸入,所以使用.encode()將字符串轉換為字節(jié)。
加密后的數(shù)據(jù)是二進制格式,為了方便顯示或存儲,使用b2a_hex()函數(shù)將其轉換為十六進制字符串。
4. 私鑰解密
decrypt = rsa.decrypt(a2b_hex(enstr), priv) print(decrypt.decode())
使用私鑰priv對加密后的數(shù)據(jù)進行解密。由于加密后的數(shù)據(jù)是以十六進制字符串形式存儲的,所以首先使用a2b_hex()函數(shù)將其轉換回二進制格式。
解密后的數(shù)據(jù)是字節(jié)類型,使用.decode()將其轉換回字符串并打印出來。
注意事項
密鑰長度:如上所述,256位的RSA密鑰長度相對較短,可能不夠安全。建議使用更長的密鑰長度,如3072位或更長。
填充方案:RSA加密通常使用某種填充方案(如PKCS#1 v1.5或OAEP)。在上述代碼中,沒有明確指定填充方案,因此rsa庫可能會使用默認的填充方案。在實際應用中,建議明確指定填充方案以確保安全性。
錯誤處理:上述代碼沒有包含任何錯誤處理邏輯。在實際應用中,應該添加適當?shù)腻e誤處理來捕獲和處理可能發(fā)生的異常,如解密失敗、無效的輸入等。
安全性:RSA加密雖然強大,但也有其局限性。它主要用于加密小量數(shù)據(jù)或用于安全地交換對稱加密密鑰。對于大量數(shù)據(jù)的加密,通常建議使用對稱加密算法,如AES,并使用RSA來安全地交換對稱密鑰。
以上就是深入挖掘Python自定義加密算法的設計與實現(xiàn)的詳細內容,更多關于Python自定義加密算法的資料請關注腳本之家其它相關文章!
相關文章
Python如何實現(xiàn)網(wǎng)絡自動化運維華為設備
本文介紹了如何使用Python實現(xiàn)華為設備的網(wǎng)絡自動化運維,包括環(huán)境配置、設備配置、功能模塊實現(xiàn)和SFTP文件傳輸測試2024-11-11python XlsxWriter模塊創(chuàng)建aexcel表格的實例講解
今天小編就為大家分享一篇python XlsxWriter模塊創(chuàng)建aexcel表格的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python?matplotlib調整坐標軸位置、標簽位置和標簽方向以及X軸刻度標簽位置
我們在用matplotlib繪制圖的時候總是有各種需求,下面這篇文章主要給大家介紹了關于Python?matplotlib調整坐標軸位置、標簽位置和標簽方向以及X軸刻度標簽位置的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04教你使用Python的pygame模塊實現(xiàn)拼圖游戲
pygame模塊是一個可以跨平臺的模塊,其設計目的就是為電子游戲而設計,能夠支持圖片和聲音,下面這篇文章主要給給大家介紹了關于使用Python的pygame模塊實現(xiàn)拼圖游戲的相關資料,需要的朋友可以參考下2022-07-07flask中使用SQLAlchemy進行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)2013-02-02Python連接Mysql實現(xiàn)圖書借閱系統(tǒng)
這篇文章主要為大家詳細介紹了Python連接Mysql實現(xiàn)圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03