원본:
비디오 다운로드. 웹사이트로 구문 분석할 때 비디오 ID가 AES로 암호화되었으며 이 라이브러리가 사용된 것으로 나타났습니다.
아주 간단한 js 코드 복호화:
t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);
원래 간단할 줄 알았는데, 복호화할 파이썬 코드 조각을 찾았는데, 반복해서 시도해 볼 줄은 몰랐습니다. 다양한 글이 있습니다. 방법은 알 수 없지만 실제로는 많은 시간이 소요됩니다.
얼마나 간단합니까? 다음 문자열 암호화 및 암호 해독만 구현하고 확인하면 됩니다.
# data = '-85297962_172051801'# key = '583a01a9ba901a3adda7252ebca42c09'# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'
1. Python Cryptography Toolkit(pycrypto)
암호화 및 암호 해독에 필요합니다. 해당 웹사이트 주소는
최신 버전입니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!