web-dev-qa-db-fra.com

Python Cryptage AES sans module supplémentaire

Est-il possible de crypter/décrypter des données avec AES sans installer de modules supplémentaires? Je dois envoyer/recevoir des données de C#, qui est chiffré avec le System.Security.Cryptography référence.

UPDATE J'ai essayé d'utiliser PyAES, mais c'est trop vieux. J'ai mis à jour certaines choses pour que cela fonctionne, mais ce n'est pas le cas. Je ne peux pas non plus installer car sa dernière version est 3.3 alors que ma version est 3.4.

12
Anton

Les services cryptographiques disponibles dans la bibliothèque standard sont ceux . Comme vous pouvez le voir, AES n'est pas répertorié, mais il est suggéré d'utiliser pycrypto qui est un module supplémentaire .

Il suffit de l'installer en utilisant pip , ou easy_install , puis en montré dans la page de pycrypto :

from Crypto.Cipher import AES
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
message = "The answer is no"
print obj.encrypt(message)

La seule autre façon sans utiliser un module supplémentaire serait de coder la fonction vous-même, mais quelle est la différence de télécharger un module supplémentaire et de l'utiliser à la place?

Si vous voulez une implémentation pure Python d'AES que vous pouvez télécharger et importer, vérifiez pyaes .

9
enrico.bacis

J'utilise Cryptography bibliothèque.

La cryptographie est une bibliothèque développée activement qui fournit des recettes et des primitives cryptographiques. Il prend en charge Python 2.6-2.7, Python 3.3+ et PyPy.

Voici un exemple de la façon d'utiliser cette bibliothèque:

>>> import os
>>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
>>> from cryptography.hazmat.backends import default_backend
>>> backend = default_backend()
>>> key = os.urandom(32)
>>> iv = os.urandom(16)
>>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
>>> encryptor = cipher.encryptor()
>>> ct = encryptor.update(b"a secret message") + encryptor.finalize()
>>> decryptor = cipher.decryptor()
>>> decryptor.update(ct) + decryptor.finalize()
'a secret message'
7
Vlad Bezden

PYAES devrait fonctionner avec n'importe quelle version de Python3.x. Pas besoin de modifier la bibliothèque.

Voici un exemple de travail complet pour le mode Pyaes CTR pour Python3.x ( https://github.com/ricmoo/pyaes )

import pyaes

# A 256 bit (32 byte) key
key = "This_key_for_demo_purposes_only!"
plaintext = "Text may be any length you wish, no padding is required"

# key must be bytes, so we convert it
key = key.encode('utf-8')

aes = pyaes.AESModeOfOperationCTR(key)    
ciphertext = aes.encrypt(plaintext)

# show the encrypted data
print (ciphertext)

# DECRYPTION
# CRT mode decryption requires a new instance be created
aes = pyaes.AESModeOfOperationCTR(key)

# decrypted data is always binary, need to decode to plaintext
decrypted = aes.decrypt(ciphertext).decode('utf-8')

# True
print (decrypted == plaintext)

Faites-moi savoir si vous obtenez des erreurs

6
Alecz

Voici une implémentation autonome d'AES compatible avec Python .

Exemple d'utilisation:

aesmodal = AESModeOfOperation() 
key = [143,194,34,208,145,203,230,143,177,246,97,206,145,92,255,84]
iv = [103,35,148,239,76,213,47,118,255,222,123,176,106,134,98,92]

size = aesmodal.aes.keySize["SIZE_128"]

mode,orig_len,ciphertext = aesmodal.encrypt("Hello, world!", aesmodal.modeOfOperation["OFB"], key, size, iv)
print(ciphertext)
plaintext = aesmodal.decrypt(ciphertext, orig_len, mode, key, size, iv)
print(plaintext)
4
snowcrash09

Pour ajouter à la réponse de @ enrico.bacis: AES n'est pas implémenté dans la bibliothèque standard. Il est implémenté dans la bibliothèque PyCrypto, qui est stable et bien testée. Si vous avez besoin d'AES, ajoutez PyCrypto en tant que dépendance de votre code.

Bien que les primitives AES soient, en théorie, assez simples pour que vous puissiez en écrire une implémentation en Python pur, il est fortement recommandé de ne pas le faire. C'est la première règle de crypto: ne l'implémentez pas vous-même. En particulier, si vous lancez simplement votre propre bibliothèque de cryptographie, vous vous laisserez certainement ouvert à une sorte d'attaque latérale.

3
MSmedberg

Python 3.6 avec module de cryptographie

from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"my deep dark secret")
print(token)


f.decrypt(token)
0