我正在尝试使用Pycryptodome(3.7.0)在Python(2.7.14)中以CBC模式加密和解密AES中的简单文本
这是我尝试加密的代码:
from Crypto.Cipher import AES
from Crypto.Util import Padding
import base64
encryption_key = "1111111111111111111111111111111111111111111111111111111111111111".decode("hex")
text = "Test text"
text_padded = Padding.pad(text, AES.block_size)
iv = "0000000000000000"
cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
cipher_enc = cipher.encrypt(text_padded)
encrypted = iv + cipher_enc
print encrypted
print base64.b64encode(encrypted)
print encrypted.encode("hex")
print base64.b64encode(encrypted).encode("hex")
输出是
0000000000000000X???]????H?
MDAwMDAwMDAwMDAwMDAwMFje9RzRXc3LHt8GBBLTSPQ=
3030303030303030303030303030303058def51cd15dcdcb1edf060412d348f4
4d4441774d4441774d4441774d4441774d4441774d466a6539527a525863334c4874384742424c545350513d
但是,当我向http://aes.online-domain-tools.com/输入相同的键,文本和初始矢量值时,得到的结果将不同。
输出为: 6a56bc5c0b05892ae4e63d0ca6b3169b
这是屏幕截图:
我在做什么错? pycrypto如何在在线加密网站上获得输出值?
答案 0 :(得分:1)
首先在python 3中:python 3在字节和字符串方面要严格得多。
这重现了给定的示例:
from Crypto.Cipher import AES
encryption_key = 32 * b'\x11'
text = "Test text".encode()
text_padded = text + (AES.block_size - (len(text) % AES.block_size)) * b'\x00'
iv = 16 * b'\x00'
cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
cipher_enc = cipher.encrypt(text_padded)
print(encryption_key.hex())
print(iv.hex())
print(cipher_enc.hex())
# 1111111111111111111111111111111111111111111111111111111111111111
# 00000000000000000000000000000000
# 6a56bc5c0b05892ae4e63d0ca6b3169b
请注意,不需要encrypted = iv + cipher_enc
;您已经在CBC模式下运行AES。
让它也可以在python 2上运行:
from Crypto.Cipher import AES
encryption_key = 32 * b'\x11'
text = "Test text".encode()
text_padded = text + (AES.block_size - (len(text) % AES.block_size)) * b'\x00'
iv = 16 * b'\x00'
cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
cipher_enc = cipher.encrypt(text_padded)
print(encryption_key.encode('hex'))
print(iv.encode('hex'))
print(cipher_enc.encode('hex'))