Skip to content Skip to sidebar Skip to footer

Python 3 Pycrypto Iv Must Be 16 Bytes Long

so I have been trying to build an AES encryption program based off of the github pycrypto guide link to github however when I go to decode an error shows up: Traceback (most recen

Solution 1:

The problem with iv is that it consists of random bytes, but it is being read into your program as a string. Calling bytes on that string does not do what you expect.

>>> iv = b'\xba\x0eyO8\x17\xcf\x97=\xf2&l34#('
>>> siv = str(iv)
>>> siv
"b'\\xba\\x0eyO8\\x17\\xcf\\x97=\\xf2&l34#('"   # Note 'b' is part of the string
>>> biv = bytes(siv, 'utf-8')
>>> biv
b"b'\\xba\\x0eyO8\\x17\\xcf\\x97=\\xf2&l34#('"  # Now there are two 'b's!

You can resolve this by using ast.literal_eval:

>>> ast.literal_eval(siv)
b'\xba\x0eyO8\x17\xcf\x97=\xf2&l34#('

Here's a working version of your code - I removed the need to copy/paste iv, but the same observations about inputting bytes applies to the ciphertext.

import ast

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes


defencrypt(key, msg):
    iv = get_random_bytes(16)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    ciphertext = cipher.encrypt(msg)    # Use the right method herereturn iv + ciphertext


defdecrypt(key, ciphertext):
    iv = ciphertext[:16]
    ciphertext = ciphertext[16:]
    cipher = AES.new(key, AES.MODE_CFB, iv)
    msg = cipher.decrypt(ciphertext)
    return msg.decode("utf-8")


if __name__ == "__main__":
    ed = input("(e)ncrypt or (d)ecrypt: ")
    if ed == "e":
        key = input("16 digit key: ")
        msg = input("message: ")
        print("Encrypted message: ", encrypt(key, msg))
    elif ed == "d":
        key = input("16 digit key: ")
        smsg = input("encrypted message: ")
        msg = ast.literal_eval(smsg)
        print("Decrypted message: ", decrypt(key, msg))

The code in action:

(e)ncryptor(d)ecrypt:e16 digit key:abcdabcdabcdabcdmessage:Spam,spam,spamEncrypted message:b'\xa4?\xa9RI>\x1f\xb5*\xb2,NWN\x0c\xfd"yB|\x1f\x82\x96\xd5\xb4\xd4\x1d&\x8bM\xdb\x07'(e)ncryptor(d)ecrypt:d16 digit key:abcdabcdabcdabcdencrypted message:b'\xa4?\xa9RI>\x1f\xb5*\xb2,NWN\x0c\xfd"yB|\x1f\x82\x96\xd5\xb4\xd4\x1d&\x8bM\xdb\x07'Decrypted message:Spam,spam,spam

Post a Comment for "Python 3 Pycrypto Iv Must Be 16 Bytes Long"