Chiffrement Python avec PyCrypto AES
Je viens de trouver pycrypto aujourd'hui, et j'ai travaillé sur ma cryptage AES de classe. Malheureusement, seulement la moitié de l'usine. auto.h.md5 sorties de hachage md5 en format hexadécimal, et est 32byte.
C'est la sortie. Il semble pour déchiffrer le message, mais il met des caractères aléatoires après décryptage, dans ce cas, \n\n\n... je pense que j'ai un problème avec la taille de bloc de soi.de données, quelqu'un sait comment résoudre ce problème?
Jans-MacBook-Pro:test2 jan$ ../../bin/python3 data.py
b'RLfGmn5jf5WTJphnmW0hXG7IaIYcCRpjattqwxr6yijcuytndib+GQYlFORm+jIctest
1 2 3 4 5 endtest\n\n\n\n\n\n\n\n\n\n"
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
from os import urandom
class Encryption():
def __init__(self):
self.h = Hash()
def values(self, data, key):
self.data = data
self.key = key
self.mode = AES.MODE_CBC
self.iv = urandom(16)
if not self.key:
self.key = Cfg_Encrypt_Key
self.key = self.h.md5(self.key, True)
def encrypt(self, data, key):
self.values(data, key)
return b64encode(self.iv + AES.new(self.key, self.mode, self.iv).encrypt(self.data))
def decrypt(self, data, key):
self.values(data, key)
self.iv = b64decode(self.data)[:16]
return AES.new(self.key, self.mode, self.iv).decrypt(b64decode(self.data)[16:])
source d'informationauteur if __name__ is None | 2013-01-06
Vous devez vous connecter pour publier un commentaire.
Pour être honnête, les personnages "\n\n\n\n\n\n\n\n\n\n" n'ont pas l'air aléatoire pour moi. 😉
Vous êtes à l'aide de l'algorithme AES en mode CBC. Qui nécessite une longueur de texte en clair et le texte chiffré à toujours être un multiple de 16 octets. Avec le code que vous montrez, vous devriez voir une exception soulevée lors de la
data
passé àencrypt()
ne remplissent pas cette condition. On dirait que vous avez ajouté assez de caractères de nouvelle ligne ('\n' à ce que l'entrée est jusqu'à ce que le texte en clair qui est arrivé à être alignés.En dehors de cela, il ya deux façons de résoudre le problème d'alignement:
Passer de la SRC (
AES.MODE_CBC
) à la BFC (AES.MODE_CFB
). Avec la valeur par défautsegment_size
utilisé par PyCrypto, vous n'aurez pas de restriction sur le texte clair et le texte chiffré longueurs.Garder de la SRC et de l'utilisation d'un protocole de remplissage comme PKCS#7, c'est:
avant de les crypter un texte en clair de
X
octets, ajouter à l'arrière comme le nombre d'octets dont vous avez besoin pour atteindre le prochain 16 frontière d'octet. Tous les octets de remplissage ont la même valeur: le nombre d'octets que vous ajoutez:Que du Python 3 style. En Python 2, vous avez:
après décryptage, retirer de l'arrière de la clair que le nombre d'octets indiqué par un rembourrage:
Même si je comprends que dans votre cas, c'est juste une classe d'exercice, je tiens à souligner qu'il est dangereux d'envoyer des données sans aucune forme d'authentification (par exemple, un MAC).
Vous pouvez utiliser un correctif caractère aussi longtemps que vous vous souvenez de la longueur de votre initiale de la charge utile, afin de ne pas "jeter" fin utile octets loin.
Essayez ceci:
AES.new().encrypt()
et.decrypt()
prendre comme entrée et de sortie des chaînes de caractères dont la longueur est un multiple de 16. Vous devez les fixer d'une façon ou d'une autre. Par exemple, vous pouvez stocker la longueur réelle au début, et l'utiliser pour tronquer la chaîne déchiffrée.Note également que, bien que c'est la seule restriction pour l'AES, d'autres modules (notamment dans
Crypto.PublicKey
) ont des restrictions supplémentaires qui vient de leur mathématique de la mise en œuvre et qui ne devrait pas (à mon avis) être visible par l'utilisateur final, mais sont. Par exempleCrypto.PublicKey.ElGamal
va crypter tout court de la chaîne, mais si elle commence avec des caractères nuls, ils sont perdus lors du déchiffrement.