>백엔드 개발 >파이썬 튜토리얼 >Python--AES 암호화 및 암호 해독 방법 지침

Python--AES 암호화 및 암호 해독 방법 지침

巴扎黑
巴扎黑원래의
2017-07-21 14:19:293441검색

원본:

비디오 다운로드. 웹사이트로 구문 분석할 때 비디오 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.