1

I'm trying to encrpyt & decrypt a simple text in AES with CBC mode in Python (2.7.14) with Pycryptodome (3.7.0)

Here's my code to attempt encryption:

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")

And the outputs are

0000000000000000X???]????H?
MDAwMDAwMDAwMDAwMDAwMFje9RzRXc3LHt8GBBLTSPQ=
3030303030303030303030303030303058def51cd15dcdcb1edf060412d348f4
4d4441774d4441774d4441774d4441774d4441774d466a6539527a525863334c4874384742424c545350513d

But when I enter the same key, text and initial vector values to http://aes.online-domain-tools.com/, I got different results.

Output is : 6a56bc5c0b05892ae4e63d0ca6b3169b

Here's the screenshot:

enter image description here

What am I doing wrong? How can I get the output value at the online encryption website by pycrypto?

erdimeola
  • 844
  • 8
  • 17

1 Answers1

1

first in python 3: python 3 is a lot stricter about bytes vs strings.

this reproduces the given example:

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

note that there is no need for encrypted = iv + cipher_enc; you are running AES in CBC mode already.


got it to run on python 2 as well:

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'))
hiro protagonist
  • 44,693
  • 14
  • 86
  • 111
  • Thank you very much, My problem was not using the b'' notation and adding initial vector value again I suppose. – erdimeola Nov 15 '18 at 13:43