AES中ECB模式的加密與解密(Python3.7)

本文主要解決的問題

本文主要是講解AES加密算法中的ECB模式的加密解密的Python3.7實現。具體AES加密算法的原理這裏不作過多介紹,想了解的能夠參考文末的參考連接。html

主要解決了兩個問題:python

  1. 在Python3.7版本下,所依賴包的安裝問題。(有一些博客時間久遠,其中所提到的模塊並不適用於Python3.7)
  2. 由於Python版本的問題,其餘博客在基於Python3.6下的代碼在Python3.7下並不能運行的問題

背景介紹

在爬蟲項目中遇到,某些網站的帳號、密碼採用了AES的ECB模式進行了加密。算法

# 加密前的數據
123456asd
# 加密後的數據
3cfeba82c31b6635e8fb085e04529e74
# 密鑰
8NONwyJtHesysWpM

使用在線AES加密解密、AES在線加密解密,進行嘗試。測試

mark

通過測試發現,在AES加密的ECB模式,填充爲pkcs7padding ,數據塊爲128位,輸出格式爲hex時,獲得本身想要的結果。網站

(這裏能夠能夠根據密文的格式進行判斷輸出的格式,通常密文以==結尾的輸出格式爲base64,不然爲hex格式)加密

問題1:Crypto模塊安裝報錯

pip 安裝 pycrypto模塊,拋以下錯誤:spa

error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2

解決方法:.net

詳見python3.7安裝pycrypto3d

問題2:網上copy來的代碼報錯

在網上博客中直接copy來的代碼,可能會拋以下錯誤。code

TypeError: Object type <class 'str'> cannot be passed to C code

換個博客,發現依舊是這個錯誤。

錯誤緣由

以前版本的代碼並不適用於Python3.7。須要進行修改。

修改後的代碼:

import base64
from Crypto.Cipher import AES
import binascii


def add_to_16(text):
    while len(text) % 16 != 0:
        text += '\0'
    return text


def encrypt(data, password):
    if isinstance(password, str):
        password = password.encode('utf8')

    bs = AES.block_size
    pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
    cipher = AES.new(password, AES.MODE_ECB)
    data = cipher.encrypt(pad(data).encode('utf8'))
    encrypt_data = binascii.b2a_hex(data)  # 輸出hex
    # encrypt_data = base64.b64encode(data)         # 取消註釋,輸出Base64格式
    return encrypt_data.decode('utf8')


def decrypt(decrData, password):
    if isinstance(password, str):
        password = password.encode('utf8')

    cipher = AES.new(password, AES.MODE_ECB)
    plain_text = cipher.decrypt(binascii.a2b_hex(decrData))
    return plain_text.decode('utf8').rstrip('\0')



if __name__ == '__main__':
    data = '123456asd'      # 待加密數據
    password = '8NONwyJtHesysWpM'  # 16,24,32位長的密碼(密鑰)
    password = add_to_16(password)
    encrypt_data = encrypt(data, password)
    print('加密前數據:{}\n======================='.format(data))
    print('加密後的數據:', encrypt_data)

    decrypt_data = decrypt(encrypt_data, password)
    print('解密後的數據:{}'.format(decrypt_data))

mark

參考

python 加密解密

AES ECB PKCS5/PKCS7 加解密 python實現 支持中文

python3.7 利用Crypto進行AES解密&加密文件

python3.7安裝pycrypto

關注公衆號西加加先生一塊兒玩轉Python在這裏插入圖片描述

原文出處:https://www.cnblogs.com/ghostlee/p/12185223.html

相關文章
相關標籤/搜索