欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入挖掘Python自定義加密算法的設計與實現(xiàn)

 更新時間:2024年12月31日 10:22:23   作者:樂茵安全  
這篇文章主要為大家詳細介紹了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 = '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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庫進行編碼和解碼操作

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自定義加密算法的資料請關注腳本之家其它相關文章!

相關文章

最新評論