python3 AES 加密

基于Crypto的python3 AES CBC pcks7padding 中文劫扒、英文、中英文混合加密

最近在模擬網(wǎng)頁(yè)請(qǐng)求時(shí)聚霜,遇到了AES加密,折騰許久珠叔,終于搞定蝎宇,獻(xiàn)上工具類給有需要的有緣人〉话玻【來(lái)自一個(gè)此前從未弄過(guò)AES加密解密的小白】

解決過(guò)程中姥芥,搜索了很多,印象深刻的是pkcs7padding汇鞭,unpadding相關(guān)代碼凉唐,查看瀏覽器歷史記錄,翻出了大大的博客鏈接:https://blog.csdn.net/davidsu33/article/details/52841955

運(yùn)行環(huán)境python3霍骄,依賴庫(kù)pycryptodome[3.3.6]

獻(xiàn)上代碼台囱,關(guān)鍵點(diǎn)都有注釋

#!/usr/bin/env python
# -*- coding=utf-8 -*-
"""
AES加密解密工具類
@author jzx
@date   2018/10/24
此工具類加密解密結(jié)果與 http://tool.chacuo.net/cryptaes 結(jié)果一致
數(shù)據(jù)塊128位
key 為16位
iv 為16位,且與key相等
字符集utf-8
輸出為base64
AES加密模式 為cbc
填充 pkcs7padding
"""

import base64
from Crypto.Cipher import AES

import random


def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最終調(diào)用AES加密方法時(shí)读整,傳入的是一個(gè)byte數(shù)組簿训,要求是16的整數(shù)倍,因此需要對(duì)明文進(jìn)行處理
    :param text: 待加密內(nèi)容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8編碼時(shí)绘沉,英文占1個(gè)byte煎楣,而中文占3個(gè)byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看與其它語(yǔ)言的約定,有的會(huì)使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text


def pkcs7unpadding(text):
    """
    處理使用PKCS7填充過(guò)的數(shù)據(jù)
    :param text: 解密后的字符串
    :return:
    """
    length = len(text)
    unpadding = ord(text[length-1])
    return text[0:length-unpadding]


def encrypt(key, content):
    """
    AES加密
    key,iv使用同一個(gè)
    模式cbc
    填充pkcs7
    :param key: 密鑰
    :param content: 加密內(nèi)容
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 處理明文
    content_padding = pkcs7padding(content)
    # 加密
    encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新編碼
    result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
    return result


def decrypt(key, content):
    """
    AES解密
     key,iv使用同一個(gè)
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # base64解碼
    encrypt_bytes = base64.b64decode(content)
    # 解密
    decrypt_bytes = cipher.decrypt(encrypt_bytes)
    # 重新編碼
    result = str(decrypt_bytes, encoding='utf-8')
    # 去除填充內(nèi)容
    result = pkcs7unpadding(result)
    return result


def get_key(n):
    """
    獲取密鑰 n 密鑰長(zhǎng)度
    :return:
    """
    c_length = int(n)
    source = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
    length = len(source) - 1
    result = ''
    for i in range(c_length):
        result += source[random.randint(0, length)]
    return result


# Test
# 非16字節(jié)的情況
aes_key = get_key(16)
print('aes_key:' + aes_key)
# 對(duì)英文加密
source_en = 'Hello!'
encrypt_en = encrypt(aes_key, source_en)
print(encrypt_en)
# 解密
decrypt_en = decrypt(aes_key, encrypt_en)
print(decrypt_en)
print(source_en == decrypt_en)
# 中英文混合加密
source_mixed = 'Hello, 韓- 梅 -梅'
encrypt_mixed = encrypt(aes_key, source_mixed)
print(encrypt_mixed)
decrypt_mixed = decrypt(aes_key, encrypt_mixed)
print(decrypt_mixed)
print(decrypt_mixed == source_mixed)

# 剛好16字節(jié)的情況
en_16 = 'abcdefgj10124567'
encrypt_en = encrypt(aes_key, en_16)
print(encrypt_en)
# 解密
decrypt_en = decrypt(aes_key, encrypt_en)
print(decrypt_en)
print(en_16 == decrypt_en)
mix_16 = 'abx張三豐12sa'
encrypt_mixed = encrypt(aes_key, mix_16)
print(encrypt_mixed)
decrypt_mixed = decrypt(aes_key, encrypt_mixed)
print(decrypt_mixed)
print(decrypt_mixed == mix_16)


運(yùn)行結(jié)果如下

aes_key:GENjnwZR4p2M5saR
zN/Fp+aYR2XKdnNQxS/bDA==
Hello!
True
M4InzQpqqC18d1KLIr6VUl7mipdgGEbjC8a3RNM3Y74=
Hello, 韓- 梅 -梅
True
qX0vFKGQ1Av9JzoNaCfBHkAOreJBike+l9h820yYnUQ=
abcdefgj10124567
True
PcgPrSAA6Lgrng+VFr1ja2O50PgQ2TOXhWfSd4KLL2M=
abx張三豐12sa
True
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末车伞,一起剝皮案震驚了整個(gè)濱河市择懂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌另玖,老刑警劉巖困曙,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谦去,居然都是意外死亡慷丽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鳄哭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)要糊,“玉大人,你說(shuō)我怎么就攤上這事妆丘〕恚” “怎么了局劲?”我有些...
    開(kāi)封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奶赠。 經(jīng)常有香客問(wèn)我鱼填,道長(zhǎng),這世上最難降的妖魔是什么毅戈? 我笑而不...
    開(kāi)封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任苹丸,我火速辦了婚禮,結(jié)果婚禮上苇经,老公的妹妹穿的比我還像新娘赘理。我一直安慰自己,他們只是感情好塑陵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布感憾。 她就那樣靜靜地躺著,像睡著了一般令花。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凉倚,一...
    開(kāi)封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天兼都,我揣著相機(jī)與錄音,去河邊找鬼稽寒。 笑死扮碧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杏糙。 我是一名探鬼主播慎王,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宏侍!你這毒婦竟也來(lái)了赖淤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谅河,失蹤者是張志新(化名)和其女友劉穎咱旱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绷耍,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吐限,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂始。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诸典。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崎苗,靈堂內(nèi)的尸體忽然破棺而出狐粱,到底是詐尸還是另有隱情舀寓,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布脑奠,位于F島的核電站基公,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宋欺。R本人自食惡果不足惜轰豆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齿诞。 院中可真熱鬧酸休,春花似錦、人聲如沸祷杈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)但汞。三九已至宿刮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間私蕾,已是汗流浹背僵缺。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踩叭,地道東北人磕潮。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像容贝,于是被迫代替她去往敵國(guó)和親自脯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容