Maison  >  Article  >  développement back-end  >  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

巴扎黑
巴扎黑original
2017-07-21 14:19:293365parcourir

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);

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'

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
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

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!

Déclaration:
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