J'essaie de créer deux fonctions en utilisant PyCrypto qui acceptent deux paramètres: le message et la clé, puis crypter / décrypter le message.
J'ai trouvé plusieurs liens sur le Web pour m'aider, mais chacun d'eux a des défauts:
Celui-ci à codekoala utilise os.urandom, ce qui est déconseillé par PyCrypto.
De plus, la clé que je donne à la fonction n'est pas garantie d'avoir la longueur exacte attendue. Que puis-je faire pour y parvenir?
De plus, il existe plusieurs modes, lequel est recommandé? Je ne sais pas quoi utiliser: /
Enfin, qu'est-ce que l'IV exactement? Puis-je fournir un IV différent pour le chiffrement et le déchiffrement, ou est-ce que le résultat sera différent?
Edit : Suppression de la partie de code car elle n'était pas sécurisée.
/dev/urandom
sur UnixRéponses:
Voici mon implémentation et fonctionne pour moi avec quelques correctifs et améliore l'alignement de la clé et de la phrase secrète avec 32 octets et iv à 16 octets:
la source
Vous pouvez avoir besoin des deux fonctions suivantes:
pad
- to pad (lors du cryptage) etunpad
- pour unpad (lors du décryptage) lorsque la longueur de l'entrée n'est pas un multiple de BLOCK_SIZE.Alors vous demandez la longueur de la clé? Vous pouvez utiliser la somme md5 de la clé plutôt que de l'utiliser directement.
De plus, selon ma petite expérience d'utilisation de PyCrypto, l'IV est utilisé pour mélanger la sortie d'un cryptage lorsque l'entrée est la même, de sorte que l'IV est choisi comme une chaîne aléatoire, et l'utilise comme partie de la sortie de cryptage, puis utilisez-le pour déchiffrer le message.
Et voici ma mise en œuvre, j'espère qu'elle vous sera utile:
la source
pad
fonction est cassée (au moins dans Py3), remplacez-la pars[:-ord(s[len(s)-1:])]
pour qu'elle fonctionne entre les versions.Permettez-moi de répondre à votre question sur les «modes». AES256 est une sorte de chiffrement par blocs . Il prend en entrée une clé de 32 octets et une chaîne de 16 octets, appelée le bloc et génère un bloc. Nous utilisons AES dans un mode de fonctionnement afin de crypter. Les solutions ci-dessus suggèrent d'utiliser CBC, qui en est un exemple. Un autre est appelé CTR, et il est un peu plus facile à utiliser:
Ceci est souvent appelé AES-CTR. Je conseillerais la prudence en utilisant AES-CBC avec PyCrypto . La raison en est qu'il vous oblige à spécifier le schéma de remplissage , comme illustré par les autres solutions données. En général, si vous ne faites pas très attention au rembourrage, il existe des attaques qui cassent complètement le cryptage!
Maintenant, il est important de noter que la clé doit être une chaîne aléatoire de 32 octets ; un mot de passe ne suffit pas . Normalement, la clé est générée comme ceci:
Une clé peut également être dérivée d'un mot de passe :
Certaines solutions ci-dessus suggèrent d'utiliser SHA256 pour dériver la clé, mais cela est généralement considéré comme une mauvaise pratique cryptographique . Consultez wikipedia pour en savoir plus sur les modes de fonctionnement.
la source
Pour quelqu'un qui aimerait utiliser urlsafe_b64encode et urlsafe_b64decode, voici la version qui fonctionne pour moi (après avoir passé du temps avec le problème Unicode)
la source
Vous pouvez obtenir une phrase secrète d'un mot de passe arbitraire en utilisant une fonction de hachage cryptographique ( PAS intégrée à Python
hash
) comme SHA-1 ou SHA-256. Python inclut la prise en charge des deux dans sa bibliothèque standard:Vous pouvez tronquer une valeur de hachage cryptographique simplement en utilisant
[:16]
ou[:24]
et elle conservera sa sécurité jusqu'à la longueur que vous spécifiez.la source
Je suis reconnaissant pour les autres réponses qui m'ont inspiré mais qui n'ont pas fonctionné pour moi.
Après avoir passé des heures à essayer de comprendre comment cela fonctionne, je suis venu avec la mise en œuvre ci - dessous avec la nouvelle PyCryptodomex bibliothèque (il est une autre histoire que je réussi à le mettre derrière proxy, sous Windows, dans un virtualenv .. ouf) de
travail sur votre implémentation, n'oubliez pas de noter les étapes de remplissage, d'encodage, de chiffrement (et vice versa). Vous devez emballer et déballer en gardant à l'esprit la commande.
la source
Pour le bénéfice des autres, voici mon implémentation de décryptage à laquelle je suis arrivé en combinant les réponses de @Cyril et @Marcus. Cela suppose que cela arrive via une requête HTTP avec le encryptedText cité et encodé en base64.
la source
Une autre prise sur cela (fortement dérivée des solutions ci-dessus) mais
testé avec python 2.7 et 3.6.5
la source
J'ai utilisé les deux
Crypto
et laPyCryptodomex
bibliothèque et c'est très rapide ...la source
Il est peu tard mais je pense que ce sera très utile. Personne ne mentionne un schéma d'utilisation comme le rembourrage PKCS # 7. Vous pouvez l'utiliser à la place des fonctions précédentes pour pad (quand faire le cryptage) et unpad (quand faire le décryptage). Je fournirai le code source complet ci-dessous.
la source
encodage utf-8 compatible
la source
la source