如何在Python中执行MCRYPT_RIJNDAEL_128 + MCRYPT_MODE_CBC?

时间:2017-06-05 03:34:30

标签: php python python-2.7 python-3.x encryption

我一直在将PHP代码翻译成Python,因为我的公司正在切换语言和框架,但是我坚持使用这一方法,我似乎无法找到它的Python等价物。

这是PHP代码:

function addpadding($string, $blocksize = 32) {
  $len = strlen($string);
  $pad = $blocksize - ($len % $blocksize);
  $string .= str_repeat(chr($pad), $pad);
  return $string;
}

function create_mpg_aes_encrypt($parameter = '', $key = '', $iv = '') {
   $return_str = http_build_query($parameter);
   return trim(bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($return_str), MCRYPT_MODE_CBC, $iv)));
}

这是我的python代码:

def addpadding_pay2go(string, blocksize=32):
   length              = len(string)
   pad                 = blocksize - (length % blocksize)
   padding_strings     = chr(pad) * pad
   new_string          = string + padding_strings
   return new_string

现在对于create_mpg_aes_encrypt,我只能在Python中重新创建第一行,我不知道如何进行第二行。

test_array = {
    'MerchantID'        : 'XXX',
    'RespondType'       : 'JSON',
    'TimeStamp'         : unixtime,
    'Version'           : '1.4',
    'MerchantOrderNo'   : 1,
    'Amt'               : 10,
    'ItemDesc'          : 'product description',
    'Key'               : 'XXXXX',
    'IV'                : 'XXXXX'
}

return_str = urllib.urlencode(test_array)

我可以做修剪和bin2hex。但我唯一的问题是“如何在Python中重新创建它?”

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($return_str), MCRYPT_MODE_CBC, $iv)

1 个答案:

答案 0 :(得分:1)

我试过这个,我不知道它是否正确

from Crypto.Cipher import AES
import urllib

def addpadding_pay2go(string, blocksize=32):
  length              = len(string)
  pad                 = blocksize - (length % blocksize)
  padding_strings     = chr(pad) * pad
  new_string          = string + padding_strings
  return new_string

def create_mpg_aes_encrypt(test_array, key, iv):
  return_str              = urllib.urlencode(test_array)
  return_str_with_padding = addpadding_pay2go(return_str)

  AES.key_size    = 128
  crypt_object    = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
  encrypted_text  = crypt_object.encrypt(return_str_with_padding)
  hex             = encrypted_text.encode('hex')
  hex_with_strip  = hex.strip()
  return hex_with_strip