Origin:
ビデオのダウンロード。Web サイトへの解析時に、ビデオ ID が AES で暗号化されており、このライブラリが使用されていることが判明しました。
非常に単純な js コードを復号する:
t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);
もともと簡単だと思って復号するための Python コードを見つけましたが、何度も試すとは予想していませんでした。方法がわからないし、実際にはかなりの時間がかかります。
なんと簡単なことなのでしょうか?次の文字列の暗号化と復号化を実装して検証するだけです:
# data = '-85297962_172051801'# key = '583a01a9ba901a3adda7252ebca42c09'# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'
1. Python Cryptography Toolkit (pycrypto)
その Web サイトのアドレスは次のとおりです:
最新バージョン。は 2.6.1 です。インストール方法は非常に簡単なデモで、その使用方法はインターネット上のあらゆる場所で見つけることができますが、私が使用した方法が間違っているように思えますが、どれが正しいのでしょうか。 ?
crypto-js は、AES デフォルト モード、AES.MODE_CBC を使用する必要があります。 jsコードもわかりにくくて、いつも挑戦しています!
2. 暗号化と復号化
コードに移動するだけで、ニーズを満たします:
# 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
同じ文字列でも、暗号化された文字列は毎回異なることがわかります。 AES についてはあまり研究したことがありませんが、それは不思議なことです。
3. パッケージ化と公開
使用する aes 復号化など、Crypto の機能の一部のみが使用されている場合は、Crypto ライブラリ全体への侵入を避けるために必要なコードを抽出できます。
奇妙なのは、ダイナミックライブラリ_AES.pydを参照する際の参照パスに問題があることです。情報を調べた結果、Crypto が参照パスをプログラムしており、そのページ コードが
#ifdef IS_PY3Km = PyModule_Create(&moduledef);#elsem = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);#endif
であり、py2exe を使用してパッケージ化して抽出し、CryptoCipher_AES.pyd の名前を Crypto.Cipher に変更していることが判明しました。 _AES.pyd ファイルをリリース ディレクトリに配置すると、非常に有益です
以上がPython -- AES 暗号化および復号化方法のガイダンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。