PyCrypto - Comment fonctionne le vecteur d'initialisation?

J'essaie de comprendre comment PyCrypto fonctionne à utiliser dans un projet mais je ne suis pas entièrement comprendre l'importance du Vecteur d'Initialisation (IV). J'ai trouvé que je puisse utiliser les mauvaises IV lors du décodage d'une chaîne et je n'ai toujours semble pour obtenir le message de retour, sauf pour les 16 premiers octets (la taille de bloc). Suis simplement à l'aide de tromper ou de ne pas comprendre quelque chose?

Voici un exemple de code pour illustrer:

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

def pad_data(data):
    if len(data) % 16 == 0:
        return data
    databytes = bytearray(data)
    padding_required = 15 - (len(databytes) % 16)
    databytes.extend(b'\x80')
    databytes.extend(b'\x00' * padding_required)
    return bytes(databytes)

def unpad_data(data):
    if not data:
        return data

    data = data.rstrip(b'\x00')
    if data[-1] == 128: # b'\x80'[0]:
        return data[:-1]
    else:
        return data


def generate_aes_key():
    rnd = Crypto.Random.OSRNG.posix.new().read(AES.block_size)
    return rnd

def encrypt(key, iv, data):
    aes = AES.new(key, AES.MODE_CBC, iv)
    data = pad_data(data)
    return aes.encrypt(data)

def decrypt(key, iv, data):
    aes = AES.new(key, AES.MODE_CBC, iv)
    data = aes.decrypt(data)
    return unpad_data(data)

def test_crypto ():
    key = generate_aes_key()
    iv = generate_aes_key() # get some random value for IV
    msg = b"This is some super secret message.  Please don't tell anyone about it or I'll have to shoot you."
    code = encrypt(key, iv, msg)

    iv = generate_aes_key() # change the IV to something random

    decoded = decrypt(key, iv, code)

    print(decoded)

if __name__ == '__main__':
    test_crypto()

Je suis à l'aide de Python 3.3.

De sortie varient en fonction de l'exécution, mais j'obtiens quelque chose comme ceci: b"1^,Kp}Vl\x85\x8426M\xd2b\x1aer secret message. Please don't tell anyone about it or I'll have to shoot you."

source d'informationauteur Tim Tisdall