Tutorial on AES encryption using the M2Crypto module in Python

  • 2020-05-07 19:57:12
  • OfStack

  AES(Advanced Encryption Standard) is a block encryption standard. AES divides the raw data into multiple 4 by 4 byte matrices for processing, and performs xor, replace, shift, and linear transformation operations on each byte in each byte matrix with a predefined key to achieve the purpose of encryption. The key length can be 128,192 or 256 bits.
The following is an example of using the Python M2Crypto library for encryption and decryption using the aes_128_ecb algorithm. Firstly, the following key points are introduced:
1. iv(Initialization vector), namely the initialization vector, is used to prevent the same data from being encrypted for many times to produce the same ciphertext. The maximum length is 16 bytes, beyond which portions are ignored and are best generated at random to increase the strength of the encryption.
2. ECB (Electronic codebook, ECB), which encrypts each 4 by 4 byte matrix with the same key and USES IV. The advantage is that each byte matrix can be encrypted independently, so each byte matrix can be encrypted simultaneously. The disadvantage is that for the relevant data, the ciphertext after encryption is 1.
3. Padding, because AES is processed in a unit of 4×4 byte matrix, because the data to be encrypted must be a multiple of 16, if it is less than a multiple of 16, it will be filled. aes_128_ecb algorithm encryption the default fill mode is pkcs5.
 


from M2Crypto.EVP import Cipher 
from M2Crypto import m2 
from M2Crypto import util 
  
ENCRYPT_OP = 1 #  Cryptographic operations  
DECRYPT_OP = 0 #  Decryption operation  
  
iv = '\0' * 16 #  Initialize the variable, for aes_128_ecb Algorithm is useless  
PRIVATE_KEY = 'dd7fd4a156d28bade96f816db1d18609' #  The key  
  
def Encrypt(data): 
 ' use aes_128_ecb The algorithm encrypts the data ' 
 cipher = Cipher(alg = 'aes_128_ecb', key = PRIVATE_KEY, iv = iv, op = ENCRYPT_OP) 
 buf = cipher.update(data) 
 buf = buf + cipher.final() 
 del cipher 
 #  Flows the plaintext from byte to 16 Into the system  
 output = '' 
 for i in buf: 
  output += '%02X' % (ord(i)) 
 return output 
  
def Decrypt(data): 
 ' use aes_128_ecb The algorithm decrypts the data ' 
 #  The cipher text from 16 Convert base to byte stream  
 data = util.h2b(data) 
 cipher = Cipher(alg = 'aes_128_ecb', key = PRIVATE_KEY, iv = iv, op = DECRYPT_OP) 
 buf = cipher.update(data) 
 buf = buf + cipher.final() 
 del cipher 
 return buf


Related articles: