小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python中AES加密解密源碼【原文和密鑰均支持中文,密鑰長度可自定義(1~30)】

 YU304jx 2023-09-20

#---AES加密解密(原文和密鑰均支持中文,密鑰長度為1~30)!!!!!!!!!!!!!!!!!

"""

AES加密主要有ECB、CBC、CFB等幾種模式。CBC模式中還有一個偏移量參數(shù)IV。

AES加密有AES-128、AES-192和AES-256三種,

分別對應(yīng)三種密鑰長度128位(16字節(jié))、192位(24字節(jié))和256位(32字節(jié))。

密鑰越長,安全性越高,加密和解密時間也會更長。一般默認(rèn)是128位,其安全性完全夠用。

"""

from Crypto.Cipher import AES

import base64

BLOCK_SIZE = 16  # Bytes

# 填充方法

pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \

                chr(BLOCK_SIZE - len(s) % BLOCK_SIZE).encode('utf8')

# 去除填充方法

unpad = lambda s: s[:-ord(s[len(s) - 1:])]

def Aes_ECB_Encrypt(data,key):   # ECB模式的加密函數(shù),data為明文,key為密鑰

    key = pad(key.encode('utf8'))

    data = pad(data.encode('utf8'))    # 將傳入的字符串轉(zhuǎn)為字節(jié)字符串 然后進(jìn)行填充至16字節(jié)的整數(shù)倍

    aes = AES.new(key,AES.MODE_ECB)  #創(chuàng)建加密對象

    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進(jìn)制編碼

    result = base64.b64encode(aes.encrypt(data))

    return result.decode('utf8')        # 以字符串的形式返回

def Aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函數(shù),data為明文,key為密鑰,iv為偏移量

    key = pad(key.encode('utf8'))

    data = pad(data.encode('utf8'))    # 補(bǔ)位

    aes = AES.new(key,AES.MODE_CBC,iv.encode('utf8'))  #創(chuàng)建加密對象

    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進(jìn)制編碼

    result = base64.b64encode(aes.encrypt(data))

    return result.decode('utf8')        # 以字符串的形式返回

def Aes_ECB_Decrypt(data,key):   # ECB模式的解密函數(shù),data為密文,key為密鑰

    key = pad(key.encode('utf8'))

    data = data.encode('utf8')

    aes = AES.new(key,AES.MODE_ECB)  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼

    result = aes.decrypt(base64.b64decode(data))

    result = unpad(result)            # 除去補(bǔ)16字節(jié)的多余字符

    return result.decode('utf8')        # 以字符串的形式返回

def Aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函數(shù),data為密文,key為密鑰

    key = pad(key.encode('utf8'))

    data = data.encode('utf8')

    aes = AES.new(key,AES.MODE_CBC,iv.encode('utf8'))  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼

    result = aes.decrypt(base64.b64decode(data))

    result = unpad(result)            # 除去補(bǔ)16字節(jié)的多余字符

    return result.decode('utf8')        # 以字符串的形式返回

if __name__ == '__main__':

    #---原文,包含中文支持!?。?!

    text = 'hello-----中文------ world'      

    #---密鑰,字節(jié)總數(shù)最大為30,包含中文支持(單個漢字為3字節(jié))!?。?/p>

    pswd = '密鑰密鑰密鑰5密鑰2鑰'

    #---CBC模式偏移量,必須為16字節(jié)(不支持中文)!?。?/p>

    iv = 'yu304-jx@163.com'

    if len(pswd.encode('utf8')) >30:

        print("密鑰字節(jié)總數(shù)=",len(pswd.encode('utf8'))," ,  超過最大值30?。?!")

        #exit

    else :

        entext = Aes_ECB_Encrypt(text,pswd)

        detext = Aes_ECB_Decrypt(entext,pswd)

        entextc = Aes_CBC_Encrypt(text,pswd,iv)

        detextc = Aes_CBC_Decrypt(entextc,pswd,iv)

        print("加密密鑰=",pswd," , 密鑰字節(jié)總數(shù)=",len(pswd.encode('utf8')),"\n")

        print("加密前長度:{}, 加密前字符串為:{}\n加密后長度:{}, ECB加密后字符串:{}\n解密后長度:{}, 解密后字符串:{}\n".format(len(text),text,len(entext),entext,len(detext),detext))

        print("加密前長度:{}, 加密前字符串為:{}\n加密后長度:{}, CBC加密后字符串:{}\n解密后長度:{}, 解密后字符串:{}".format(len(text),text,len(entextc),entextc,len(detextc),detextc))

# Ref:https://blog.csdn.net/dxhklck/article/details/128200165

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多