[Python] J'ai créé une fonction qui déchiffre et décrypte AES simplement en le lançant avec pycrypto.

Ce que vous pouvez faire -Lorsqu'elles sont exécutées avec du texte brut, un mot de passe et un vecteur comme arguments, les données chiffrées au format base64 sont renvoyées. -De même, si le texte brut est remplacé par les données chiffrées au format base64 et exécutées, le texte brut est renvoyé.

Conditions de chiffrement AES La clé doit avoir une longueur de 16 octets, 24 octets ou 32 octets. Le texte brut doit être un multiple de 16 octets. Utilisez iv pour rendre la tâche plus difficile à deviner. En ce qui concerne iv, je pense qu'il est approprié d'utiliser le même pour une application.

Je pense que c'est correct de le copier et de l'utiliser, mais je ne peux pas garantir que le code est correct car je ne comprends pas parfaitement AES. Si vous avez des vulnérabilités, veuillez nous en informer dans les commentaires.

L'installation est

$ pip install pycrypto

Chiffrement

get_encrypt_data.py



from Crypto.Cipher import AES
import hashlib
import base64

def get_encrypt_data(raw_data, key, iv):
    raw_data_base64 = base64.b64encode(raw_data)
    # 16byte
    if len(raw_data_base64) % 16 != 0:
        raw_data_base64_16byte = raw_data_base64
        for i in range(16 - (len(raw_data_base64) % 16)):
            raw_data_base64_16byte += "_"
    else:
        raw_data_base64_16byte = raw_data_base64
    secret_key = hashlib.sha256(key).digest()
    iv = hashlib.md5(iv).digest()
    crypto = AES.new(secret_key, AES.MODE_CBC, iv)
    cipher_data = crypto.encrypt(raw_data_base64_16byte)
    cipher_data_base64 = base64.b64encode(cipher_data)
    return cipher_data_base64

Données de texte brut comme argument. clé. vecteur. Tout d'abord, passez à base64 (pour que les caractères et les images à deux octets soient ok) Deuxièmement, l'instruction chiffrée doit être un multiple de 16 bits, donc Fondamentalement, "_" qui n'est pas utilisé dans base64 est complété par un ketsu et converti en un multiple de 16 bits. Si c'est un multiple de 16 octets, c'est comme ça Changez la clé en 32 bits avec sha256. Modifiez le vecteur à une longueur de 16 bits avec MD5. Cryptez-le, convertissez-le en base64 pour une transmission facile et renvoyez-le.

Décryptage

get_decrypt_data.py



from Crypto.Cipher import AES
import hashlib
import base64

def get_decrypt_data(cipher_data_base64, key, iv):
    cipher_data = base64.b64decode(cipher_data_base64)
    secret_key = hashlib.sha256(key).digest()
    iv = hashlib.md5(iv).digest()
    crypto = AES.new(secret_key, AES.MODE_CBC, iv)
    raw_data_base64_16byte = crypto.decrypt(cipher_data)
    raw_data_base64 = raw_data_base64_16byte.split("_")[0]
    raw_data = base64.b64decode(raw_data_base64)
    return raw_data

Données chiffrées converties en base64 comme argument. clé. vecteur. Tout d'abord, convertissez les données cryptées converties en base64 en données cryptées. Puis changez la clé en 32 bits avec sha256. Décrypter et extraire uniquement base64 valide avec split ("_") [0] et renvoyer après la conversion.

Résultat de l'exécution

main.py


if __name__ == "__main__":
    message = "114514"
    password = "This is password"
    iv = "hoge"
    encrypt_data = get_encrypt_data(message, password, iv)
    print encrypt_data
    decrypt_data = get_decrypt_data(encrypt_data, password, iv)
    print decrypt_data

cmd.sh


$ r64FMFs04APfNQo2d6uFpQ==
$ 114514

Recommended Posts

[Python] J'ai créé une fonction qui déchiffre et décrypte AES simplement en le lançant avec pycrypto.
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé une VM qui exécute OpenCV pour Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
Un mémo que j'ai touché au magasin de données avec python
Création d'une application Web qui mappe les informations sur les événements informatiques avec Vue et Flask
J'ai créé un système qui vous permet de tweeter simplement en passant un appel téléphonique
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai fait un blackjack avec du python!
Associez Python Enum à une fonction pour la rendre appelable
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
[Je l'ai fait avec Python] Outil pour la sortie par lots de données XML
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait une minuterie pomodoro dure qui fonctionne avec CUI
J'ai fait un texte Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku