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