Home  >  Article  >  Backend Development  >  Python--AES encryption and decryption method guidance

Python--AES encryption and decryption method guidance

巴扎黑
巴扎黑Original
2017-07-21 14:19:293365browse

Origin:

When the video was downloaded and parsed to a website, it was found that the video ID was encrypted with AES and this library was used.
Decrypt a very simple js code:

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

I originally thought it would be simple and found a python code to decrypt, but I didn’t expect to try it over and over again. How to write it There are so many different things, but I can’t figure them out, and it takes a lot of effort!

How simple? I only need to verify the following string encryption and decryption:

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

1. Python Cryptography Toolkit (pycrypto)

It is needed for encryption and decryption. Its URL is:
The latest version is 2.6.1. How to install it is a very simple demo. It is all on the page, and its usage can be found everywhere on the Internet, but it just can’t solve my problem. I think I used it wrong, but which one is right?

crypto-js should use the AES default mode, AES.MODE_CBC. The js code is also difficult to understand, I always keep trying!

2. Encryption and decryption

Just go to the code, it meets the needs:

# 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

For the same string, it is found that the encrypted string is different every time. I don’t have much research on AES, which is strange!

3. Packaging and publishing

If only some functions of Crypto are used, such as the aes decryption we use, you can extract them Required code to avoid breaking into the entire Crypto library.

The strange thing is that there is a problem with the reference path when referencing the dynamic library _AES.pyd. After consulting the information, it turns out that Crypto has programmed its reference path, and its page code reads:

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

and uses py2exe to package and extract it. , it renamed the Crypto\Cipher\_AES.pyd file to Crypto.Cipher._AES.pyd and placed it in the release directory, which is quite insightful

The above is the detailed content of Python--AES encryption and decryption method guidance. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn