天天看點

aes加密算法python語言實作_pycrypto實作AES加密和解密

一 代碼

# -*- coding: UTF-8 -*-

import string

import random

from Crypto.Cipher import AES

def keyGenerater(length):

'''生成指定長度的秘鑰'''

if length not in (16, 24, 32):

return None

x = string.ascii_letters+string.digits

return ''.join([random.choice(x) for i in range(length)])

def encryptor_decryptor(key, mode):

return AES.new(key, mode, b'0000000000000000')

#使用指定密鑰和模式對給定資訊進行加密

def AESencrypt(key, mode, text):

encryptor = encryptor_decryptor(key, mode)

return encryptor.encrypt(text)

#使用指定密鑰和模式對給定資訊進行解密

def AESdecrypt(key, mode, text):

decryptor = encryptor_decryptor(key, mode)

return decryptor.decrypt(text)

if __name__ == '__main__':

text = 'Python3.5 is excellent.'

key = keyGenerater(16)

#随機選擇AES的模式

mode = random.choice((AES.MODE_CBC, AES.MODE_CFB, AES.MODE_ECB, AES.MODE_OFB))

if not key:

print('Something is wrong.')

else:

print('key:', key)

print('mode:', mode)

print('Before encryption:', text)

#明文必須以位元組串形式,且長度為16的倍數

text_encoded = text.encode()

text_length = len(text_encoded)

padding_length = 16 - text_length%16

text_encoded = text_encoded + b'0'*padding_length

text_encrypted = AESencrypt(key, mode, text_encoded)

print('After encryption:', text_encrypted)

text_decrypted =AESdecrypt(key, mode, text_encrypted)

print('After decryption:', text_decrypted.decode()[:-padding_length])

二 運作結果

E:\python\python可以這樣學\第18章 密碼學程式設計\code>python AES_test.py

('key:', 'D5pcO6iu0HIbj3I2')

('mode:', 1)

('Before encryption:', 'Python3.5 is excellent.')

('After encryption:', '\xf4\x15\x9f\xaf\xea\xd0\n\x03\xfdf\xf6}9\xaa\xa34\xb4\x1eL2\x0e \x16\xa5 \xff?\x8bA\x8e\xdd\xa8')

('After decryption:', u'Python3.5 is excellent.')