ホームページ  >  記事  >  バックエンド開発  >  Python -- AES 暗号化および復号化方法のガイダンス

Python -- AES 暗号化および復号化方法のガイダンス

巴扎黑
巴扎黑オリジナル
2017-07-21 14:19:293363ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。