This is understandably confusing - PyCrypto got a little off track and broke down with the usual implementation. If you are familiar enough with what encrypted data usually looks like, Python's output looks clearly erroneous and gives you the opportunity to get started. If you do not, then itβs easy to ask what the hell went wrong, and I donβt know where to start.
In the "normal" implementation, the add-on will be used by default, and you will end (in this case) with an encrypted output that will contain 16 bytes.
Encrypted using Ruby, for example, this is the result:
>> ciphertext => "\xD6\x83\x8Dd!VT\x92\xAA`A\x05\xE0\x9B\x8B\xF1\xD5f\xC7\xFFNI\xC7N\xBC-;!\f\xF1!\xB4" >> ciphertext.bytes => [214, 131, 141, 100, 33, 86, 84, 146, 170, 96, 65, 5, 224, 155, 139, 241, 213, 102, 199, 255, 78, 73, 199, 78, 188, 45, 59, 33, 12, 241, 33, 180]
PyCrypto, for reasons that I cannot immediately find, chose to work only with loose data . When exchanging data with PyCrypto, you want to configure any other libraries accordingly.
In the case of the Ruby OpenSSL library, the Cipher object provides a padding property that can be used to disable padding:
>> require 'openssl' => true >> obj2 = OpenSSL::Cipher::Cipher.new("AES-128-CBC") => #<OpenSSL::Cipher::Cipher:0x007fe62407a9b0> >> obj2.decrypt => #<OpenSSL::Cipher::Cipher:0x007fe62407a9b0> >> obj2.key = 'This is a key123' => "This is a key123" >> obj2.iv = 'This is an IV456' => "This is an IV456" >> obj2.padding = 0 => 0 >> ciphertext = [214, 131, 141, 100, 33, 86, 84, 146, 170, 96, 65, 5, 224, 155, 139, 241].pack('c*') => "\xD6\x83\x8Dd!VT\x92\xAA`A\x05\xE0\x9B\x8B\xF1" >> obj2.update(ciphertext) + obj2.final => "The answer is no"