4

Je compare les implémentations AES en Python à partir des bibliothèques pycrypto et cryptography.io.Différences d'implémentation AES Python

from cryptography.hazmat.primitives.ciphers import Cipher, modes, algorithms 
from cryptography.hazmat.backends import default_backend # http://cryptography.io 
from Crypto.Cipher import AES # http://pycrypto.org 

key = b'Sixteen byte key' 
iv = b'Sixteen byte ivv' 
cipher1 = AES.new(key, AES.MODE_CFB, iv) 
cipher2 = Cipher(algorithms.AES(key), modes.CFB(iv), default_backend()) 

plaintext = b"Plaintext" 

print(cipher1.encrypt(plaintext)) 
print(cipher1.decrypt(plaintext)) 
print(cipher2.encryptor().update(plaintext)) 
print(cipher2.decryptor().update(plaintext)) 

Les impressions MWE:

b'\xe4\xb4\xeb\xe3Si\x9ap\xee' 
b'7\xda\x98\xee\x05\xe4\xa0\xc7,' 
b'\xe4"\xd4mo\xa3;\xa9\xe0' 
b'\xe4"\xd4mo\xa3;\xa9\xe0' 

Pourquoi les sorties différentes?

Répondre

4

La réponse semble être que PyCrypto implémente CFB-8 par défaut, ce qui est une variante sur CFB normal. https://github.com/digitalbazaar/forge/issues/100 décrit le problème plus en détail.

+0

Peut-être que vous voulez dire CFB-8? Le comportement par défaut de CFB PyCrypto est décrit [ici] (https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.AES-module.html#new): 'segment_size (entier) - (Seulement MODE_CFB) .Le nombre de bits dans lesquels le texte en clair et le texte chiffré sont segmentés. Il doit être un multiple de 8. Si 0 ou non spécifié, il sera supposé être 8. ' – SquareRootOfTwentyThree

+0

@SquareRootOfTwentyThree Oui en effet, corrigé. –

2

Sur la base de la réponse d'Alex Gaynor, voici une description plus détaillée:

Selon la norme, la taille d'entrée doit être un multiple de la taille du segment. La plupart des implémentations utilisent une taille de segment de 16 octets (128 bits) par défaut et ignorent cette exigence. PyCrypto utilise 8 segments d'octets par défaut, mais vous pouvez le modifier comme ceci:

cipher1 = AES.new(key, AES.MODE_CFB, iv, segment_size=128) 

Ce produit des données chiffrées identiques à l'autre bibliothèque.