遇到一个问题,php AES算法中,由于可以使用mcrypt_create_iv 生成一种随机的iv,使用的是MCRYPT_MODE_ECB模式。我这里需要用python来实现这种算法。
PHP版本:
class Security { public static function encrypt($input, $key) { $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $input = Security::pkcs5_pad($input, $size); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } private static function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function decrypt($sStr, $sKey) { $decrypted= mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $sKey, base64_decode($sStr), MCRYPT_MODE_ECB ); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s-1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } }
python 版本:
from Crypto.Cipher import AES import base64 class Bussiness(object): """ 加密处理类 """ def __init__(self): self.key = 'e28a9468a8204621' self.BS = 16 self.mode = AES.MODE_ECB def encrypt(self,text): """ AES加密方法 """ encryptor = AES.new(self.key,self.mode) #补位 padded_text = text + (self.BS - len(text) % self.BS) * chr(self.BS - len(text) % self.BS) print self.BS - len(text) % self.BS ciphertext = encryptor.encrypt(padded_text) return base64.b64encode(ciphertext) def decrypt(self, text): cryptor = AES.new(self.key,self.mode) plain_text = cryptor.decrypt(base64.b64decode(text)) dec_s = len(plain_text) padding = plain_text[dec_s-1] #删除补位字符串 return plain_text.rstrip(padding)