Maison > développement back-end > Tutoriel Python > Python--AES conseils sur les méthodes de cryptage et de déchiffrement

Python--AES conseils sur les méthodes de cryptage et de déchiffrement

巴扎黑
Libérer: 2017-07-21 14:19:29
original
3437 Les gens l'ont consulté

Origine :

Lorsque la vidéo a été téléchargée et analysée sur un site Web, il a été constaté que l'identifiant de la vidéo était crypté avec AES et que cette bibliothèque avait été utilisée.
Décrypter un code js très simple :

t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);
Copier après la connexion

Au départ, je pensais que ce serait simple et j'ai trouvé un code python à décrypter, mais je ne l'ai pas fait Je ne m'attends pas à l'essayer encore et encore. , il existe toutes sortes de méthodes d'écriture, mais je n'arrive pas à comprendre, et cela demande beaucoup d'efforts !

Comme c'est simple ? Il me suffit de vérifier le cryptage et le déchiffrement de chaîne suivants :

    # data = '-85297962_172051801'# key = '583a01a9ba901a3adda7252ebca42c09'# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'
Copier après la connexion

1. Il est nécessaire pour le cryptage et le décryptage. L'adresse de son site Web est :

La dernière version est la 2.6.1. Comment l'installer est une démo très simple. Tout est sur la page, et son utilisation peut être trouvée partout sur Internet, mais cela ne peut tout simplement pas résoudre mon problème. Je pense que je l'ai mal utilisé, mais lequel est le bon. ?


crypto-js doit utiliser le mode par défaut AES, AES.MODE_CBC. Le code js est également difficile à comprendre, j'essaie toujours !

2. Cryptage et décryptage

Il suffit d'aller au code, il répond aux besoins :

# coding=utf-8import base64from Crypto.Cipher import AESfrom Crypto import Randomfrom hashlib import md5

BLOCK_SIZE = AES.block_sizedef pad(data):
    length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)return data + (chr(length) * length).encode()def unpad(data):return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]def bytes_to_key(my_data, salt, output=48):# extended from assert len(salt) == 8, len(salt)
    my_data += salt
    key = md5(my_data).digest()
    final_key = keywhile len(final_key) < output:
        key = md5(key + my_data).digest()
        final_key += keyreturn final_key[:output]def encrypt(message, passphrase):
    salt = Random.new().read(8)
    key_iv = bytes_to_key(passphrase, salt, 32 + 16)
    key = key_iv[:32]
    iv = key_iv[32:]
    aes = AES.new(key, AES.MODE_CBC, iv)return base64.b64encode(b"Salted__" + salt + aes.encrypt(pad(message)))def decrypt(data, password):if len(data) <= BLOCK_SIZE:return data

    data = base64.b64decode(data)
    salt = data[8:16]
    key_iv = bytes_to_key(password, salt, 32 + 16)
    key = key_iv[:32]
    iv = key_iv[32:]

    cipher = AES.new(key, AES.MODE_CBC, iv)return unpad(cipher.decrypt(data[BLOCK_SIZE:]))if __name__ == '__main__':# data = '-85297962_172051801'# key = '583a01a9ba901a3adda7252ebca42c09'# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'key = '583a01a9ba901a3adda7252ebca42c09'data = '-85297962_172051801'encrypt_data = encrypt(data, key)print encrypt_data# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'decrypt_data = decrypt(encrypt_data, key)print 'decrypt_data:', decrypt_data
Copier après la connexion
Pour une même chaîne, on constate que la chaîne chiffrée est différente à chaque fois. Je n’ai pas beaucoup de recherches sur AES, ce qui est étrange !

3. Packaging et publication

Si seules certaines fonctions de Crypto sont utilisées, comme le décryptage aes que nous utilisons, elles peuvent être simplifiées. . Code requis pour éviter de pénétrer dans toute la bibliothèque Crypto.

Ce qui est étrange, c'est qu'il y a un problème avec le chemin de référence lors du référencement de la bibliothèque dynamique _AES.pyd. Après consultation des informations, il s'avère que Crypto a écrit son chemin de référence, et son code de page s'écrit ainsi :



#ifdef IS_PY3Km = PyModule_Create(&moduledef);#elsem = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);#endif
Copier après la connexion

et utilisez py2exe Après l'empaquetage et l'extraction, CryptoCipher_AES.pyd a été renommé en fichier Crypto.Cipher._AES.pyd et placé dans le répertoire de version, ce qui est assez perspicace

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal