• # openssl

    Posté par . En réponse au message Chiffrement en python déchiffrement par openssl. Évalué à 7. Dernière modification le 07 février 2012 à 22:53.

    Essayons de chiffrer avec openssl :

    % echo -n tatatototatatoto | openssl enc -aes-128-cbc -k totototototototo | wc -c
    48
    
    

    La sortie fait 48 octets, alors que votre programme produit 16 octets (qui est la longueur d'un bloc chiffré). Donc openssl s'attend à plus d'informations dans ce mode (en fait, il s'attend à obtenir un fichier produit par "openssl enc -e", qui donnera le bon format).

    On peut cependant l'utiliser dans un mode plus brut :

    % echo -n totototototototo | xxd -g 0 # pour la clef en hexadécimal
    0000000: 746f746f746f746f746f746f746f746f totototototototo
    % echo -n tatatototatatoto | openssl enc -nopad -nosalt -aes-128-cbc -K 746f746f746f746f746f746f746f746f -iv 00000000000000000000000000000000 | md5sum
    3ac872fa4bc3d95b9560f565d658cfc0 -
    % python -c 'import sys, Crypto.Cipher.AES as A; sys.stdout.write(A.new("totototototototo").encrypt("tatatototatatoto"))' | md5sum
    3ac872fa4bc3d95b9560f565d658cfc0 -
    
    

    On obtient donc le bon résultat.

    "-k" va tenter de dériver une clef à partir de son argument mot de passe, alors que vous passiez une clef au chiffrement en Python. Pour passer la clef, il faut utiliser "-K", et passer un "-iv" puisque vous utilisez CBC.


    Cependant, on ne saurait trop vous recommander de ne pas utiliser les primitives de chiffrement, comme AES-CBC. AES-CBC ne réalise qu'un chiffrement, et ne permet pas à lui seul une vérification d'intégrité. Il faut par exemple lui adjoindre un chiffrement haché (HMAC). Et cela ne suffit pas pour les transmissions réseaux. Attaques par rejeu etc. sont au programme.
    Il est facile avec le chiffrement de se croire en sécurité, alors qu'il faut faire attention à de nombreuses choses, même en ne parlant que des aspects techniques. Utilisez des programmes (GnuPG (il sait réaliser des chiffrements symétriques)) ou des protocoles (SSL/TLS (TLS-PSK pour le chiffrement symétrique)) existants, plutôt que réinventer votre chiffrement. Sauf bien sûr, si c'est dans un but pédagogique.

    Un article intéressant à ce sujet (bien qu'un peu trop distrayant, et qu'un passage ne soit pas clair du tout, nécessitant de lire Wikipedia à côté) : If You're Typing The Letters A-E-S Into Your Code, You're Doing It Wrong.