Heim >Backend-Entwicklung >Python-Tutorial >Python – Anleitung zur AES-Verschlüsselung und -Entschlüsselung

Python – Anleitung zur AES-Verschlüsselung und -Entschlüsselung

巴扎黑
巴扎黑Original
2017-07-21 14:19:293437Durchsuche

Ursprung:

Als das Video heruntergeladen und auf einer Website analysiert wurde, wurde festgestellt, dass die Video-ID mit AES verschlüsselt war und diese Bibliothek verwendet wurde.
Entschlüsseln Sie einen sehr einfachen JS-Code:

t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);

Ich dachte ursprünglich, es wäre einfach und habe einen Python-Code zum Entschlüsseln gefunden, aber ich habe es nicht getan Ich erwarte nicht, es immer wieder zu versuchen, es gibt alle möglichen Schreibmethoden, aber ich komme nicht dahinter und es erfordert viel Mühe!

Wie einfach? Ich muss nur die folgende Zeichenfolgenverschlüsselung und -entschlüsselung überprüfen:

    # data = '-85297962_172051801'# key = '583a01a9ba901a3adda7252ebca42c09'# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'

1. Python Cryptography Toolkit (pycrypto)

Es wird für die Ver- und Entschlüsselung benötigt. Die Website-Adresse lautet:
Die neueste Version ist 2.6.1. Wie man es installiert, ist eine sehr einfache Demo. Es ist alles auf der Seite und seine Verwendung kann überall im Internet gefunden werden, aber es kann mein Problem einfach nicht lösen, aber welches ist richtig ?

Crypto-JS sollte den AES-Standardmodus AES.MODE_CBC verwenden. Der js-Code ist auch schwer zu verstehen, ich versuche es immer weiter!

2. Verschlüsselung und Entschlüsselung

Gehen Sie einfach zum Code, er entspricht den Anforderungen:

# 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

Für dieselbe Zeichenfolge wurde festgestellt, dass die verschlüsselte Zeichenfolge jedes Mal unterschiedlich ist. Ich habe nicht viel über AES recherchiert, was seltsam ist!

3. Verpackung und Veröffentlichung

Wenn nur einige Funktionen von Crypto verwendet werden, wie z. B. die von uns verwendete AES-Entschlüsselung, können diese vereinfacht werden . Erforderlicher Code, um einen Einbruch in die gesamte Crypto-Bibliothek zu vermeiden.

Das Seltsame ist, dass es ein Problem mit dem Referenzpfad gibt, wenn auf die dynamische Bibliothek _AES.pyd verwiesen wird. Nach Durchsicht der Informationen stellt sich heraus, dass Crypto seinen Referenzpfad geschrieben hat und sein Seitencode wie folgt geschrieben ist:

#ifdef IS_PY3Km = PyModule_Create(&moduledef);#elsem = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);#endif

und py2exe verwenden Nach dem Packen und Extrahieren wurde CryptoCipher_AES.pyd in die Datei Crypto.Cipher._AES.pyd umbenannt und im Release-Verzeichnis abgelegt, was sehr aufschlussreich ist

Das obige ist der detaillierte Inhalt vonPython – Anleitung zur AES-Verschlüsselung und -Entschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn