PyCrypto problème à l'aide d'AES+CTR
Je suis en train d'écrire un morceau de code pour chiffrer un texte à l'aide du chiffrement symétrique. Mais il ne vient pas de retour avec le bon résultat...
from Crypto.Cipher import AES
import os
crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter = lambda : os.urandom(16))
encrypted = crypto.encrypt("aaaaaaaaaaaaaaaa")
print crypto.decrypt(encrypted)
Ici, le texte décrypté est différent de l'original.
Je ne comprends pas vraiment beaucoup sur de la cryptographie, de sorte s'il vous plaît garder avec moi. Je comprends la CTR mode nécessite un "compteur" de la fonction d'approvisionnement aléatoire compteur à chaque fois, mais pourquoi est-il besoin de cela pour être de 16 octets lors de ma clé est de 32 octets et il insiste sur le fait que mon message est un multiple de 16 octets en trop? Est-ce normal?
Je suppose qu'il ne veut pas revenir au message d'origine parce que le compteur changé entre chiffrer et déchiffrer. Mais alors, comment est-il censé fonctionner en théorie, de toute façon? Ce que je fais mal? De toute façon, je suis obligé de revenir à la BCE jusqu'à ce que j'ai trouver cela 🙁
OriginalL'auteur xster | 2010-07-01
Vous devez vous connecter pour publier un commentaire.
La
counter
doivent retourner le même sur le déchiffrement comme il l'a fait sur le cryptage, comme vous intuit, donc, un (PAS SÉCURISÉ À TOUS les) façon de le faire est:CTR est une bloc de chiffrement, de sorte que le "16-à-un-temps" contrainte qui semble vous surprendre est assez naturel.
Bien sûr, un soi-disant "contre" le retour de la même valeur à chaque appel est extrêmement précaire. Ne prend pas beaucoup de faire mieux, de l'e.g....:
En fait CTR peut chiffrer n'importe quelle quantité de texte; il convertit un algorithme de chiffrement par bloc dans une clé de générateur de flux. Il n'y a pas de véritable raison de la restriction que l'entrée soit un multiple de la taille du bloc dans ce cas.
PyCrypto semble donner une erreur lors de l'entrée n'est pas un multiple de 16 octets cependant
Yep, vous avez juste besoin de tampon d'entrée (au plus proche multiple de 16) si vous souhaitez utiliser pycrypto.
mais si j'utilise AES pour chiffrer les mots de passe à travers les séances, je dois enregistrer le comptoir aussi quelque part afin de décrypter la prochaine fois que je le lance? N'est-ce pas la défaite, la sécurité d'avoir aléatoire compteurs?
OriginalL'auteur Alex Martelli
AES est un algorithme de chiffrement par bloc: c'est un algorithme (plus précisément, une paire d'algorithmes) qui prend une clé et d'un bloc de message et soit le chiffre ou déchiffre le bloc. De la taille d'un bloc est toujours de 16 octets, quelle que soit la taille de la clé.
CTR est une mode de fonctionnement. C'est une paire d'algorithmes qui s'appuie sur un algorithme de chiffrement par bloc pour produire un flux de chiffrement, ce qui peut chiffrer et déchiffrer des messages de longueurs arbitraires.
CTR fonctionne en combinant successives des blocs de message avec le cryptage des valeurs successives d'un compteur. La taille du compteur doit être un bloc de sorte qu'il est valide d'entrée pour l'algorithme de chiffrement par bloc.
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
. Mais si la clé est utilisée plusieurs fois, puis la deuxième message n'est pas autorisé à réutiliser les valeurs de compteur utilisé par le premier message, et la meilleure façon de s'assurer que est de produire la première valeur du compteur au hasard (avec un 2^128 de l'espace, les chances de collision sont assez négligeable).En permettant à l'appelant de choisir une fonction de compteur, le PyCrypto bibliothèque vous donne suffisamment de corde pour se pendre. Vous devez utiliser
Crypto.Util.Counter
, pas juste “pour de meilleures performances”, comme la documentation, il met, mais parce qu'il est plus facile de construire quelque chose de sûr que ce que vous êtes susceptible de venir avec votre propre. Et même alors, prenez soin d'utiliser un hasard valeur initiale, ce qui n'est pas la valeur par défaut.int_of_string(iv)
peut être remplacé parint.from_bytes(iv, byteorder='big')
en Python 3OriginalL'auteur Gilles
Il doit être de la même longueur que le chiffre de la taille de bloc. CTR mode crypte le comptoir et XORs le texte en clair avec la chiffré bloc compteur.
Notes:
Standard avertissement: Crypto est dur. Si vous ne comprenez pas ce que vous faites, vous sera se tromper.
Utilisation scrypt. scrypt comprend
encrypt
etdecrypt
qui utilise AES-CTR avec un mot-clé dérivée.OriginalL'auteur Terrel Shumway
Le vecteur d'initialisation ("compteur") doit rester la même, tout comme la clé n', entre le chiffrement et le déchiffrement. Il est utilisé de sorte que vous pouvez coder le même texte d'un million de fois, et obtenir différentes chiffré à chaque fois (la prévention de certains connus en clair attaques et le pattern matching /attaques). Vous devez toujours utiliser le même IV lors du déchiffrement comme lors du chiffrement. Habituellement, lorsque vous démarrez le décryptage d'un ruisseau, l'initialisation de la IV à la même valeur que vous avez commencé avec quand vous avez commencé le chiffrement des flux.
Voir http://en.wikipedia.org/wiki/Initialization_vector pour plus d'informations sur l'initialisation des vecteurs.
Noter que les os.urandom(16) n'est pas "déterministe", qui est une exigence pour le compteur de fonctions. Je vous suggère d'utiliser la fonction increment, c'est comment CTR mode est conçu. La première valeur du compteur doit être aléatoire, mais les valeurs successives doivent être entièrement prévisible à partir de la valeur initiale (déterministe). La valeur initiale peut même être pris en charge pour vous (je ne connais pas les détails)
Sur la clef, IV, d'entrée et de tailles, il semble que le chiffre que vous avez choisi a une taille de bloc de 16 octets. Tout ce que vous décrivez correspond et me semble normal.
OriginalL'auteur Slartibartfast
J'ai peut-être certainement en retard et j'ai peut-être négligé les réponses précédentes, mais je n'ai pas trouvé une déclaration claire de la façon dont cela devrait (au moins à mon humble avis) être fait selon les PyCrypto paquets.
La Crypto.Util.Compteur paquet fournit appelable dynamique des compteurs, qui sont très utiles, mais il était facile pour moi de les utiliser de manière inappropriée.
Vous devez créer un compteur, par exemple, de
ctr = Counter.new('parameters here')
. Chaque fois que votre compteur est appelé par votre mode compteur objet de chiffrement pour chiffrer le message, il est incrémenté. Ceci est nécessaire pour de bonnes pratiques de la cryptographie, sinon d'informations sur l'égalité des blocs peuvent avoir des fuites à partir du texte chiffré.Maintenant, vous ne pouvez pas appeler la fonction de déchiffrement sur le même chiffrement de l'objet, car il appelle de nouveau le même compteur qui dans l'intervalle a été incrémenté, éventuellement plusieurs fois. Ce que vous devez faire est de créer un nouveau chiffrement objet avec un autre compteur initialisé avec les mêmes paramètres. De cette façon, le déchiffrement fonctionne correctement, le démarrage du compteur à partir du même point que le chiffrement a été fait.
Exemple ci-dessous:
OriginalL'auteur Halberdier