我在PHP中有一个函数,可按如下所示加密文本:
function encrypt($text) { $Key = "MyKey"; return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $Key, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); }
如何在Python中解密这些值?
要解密这种加密形式,您将需要获得Rijndael版本。在这里可以找到一个。然后,您将需要模拟PHP Mcrypt模块中使用的键和文本填充。它们增加'\0'了填充文本和键的正确大小。他们使用的是256位块大小,并且您提供的密钥使用的密钥大小为128(如果您提供更大的密钥,则密钥大小可能会增加)。不幸的是,我链接到的Python实现一次只能编码一个块。我创建了python函数,用于模拟Python中的加密(用于测试)和解密
'\0'
import rijndael import base64 KEY_SIZE = 16 BLOCK_SIZE = 32 def encrypt(key, plaintext): padded_key = key.ljust(KEY_SIZE, '\0') padded_text = plaintext + (BLOCK_SIZE - len(plaintext) % BLOCK_SIZE) * '\0' # could also be one of #if len(plaintext) % BLOCK_SIZE != 0: # padded_text = plaintext.ljust((len(plaintext) / BLOCK_SIZE) + 1 * BLOCKSIZE), '\0') # -OR- #padded_text = plaintext.ljust((len(plaintext) + (BLOCK_SIZE - len(plaintext) % BLOCK_SIZE)), '\0') r = rijndael.rijndael(padded_key, BLOCK_SIZE) ciphertext = '' for start in range(0, len(padded_text), BLOCK_SIZE): ciphertext += r.encrypt(padded_text[start:start+BLOCK_SIZE]) encoded = base64.b64encode(ciphertext) return encoded def decrypt(key, encoded): padded_key = key.ljust(KEY_SIZE, '\0') ciphertext = base64.b64decode(encoded) r = rijndael.rijndael(padded_key, BLOCK_SIZE) padded_text = '' for start in range(0, len(ciphertext), BLOCK_SIZE): padded_text += r.decrypt(ciphertext[start:start+BLOCK_SIZE]) plaintext = padded_text.split('\x00', 1)[0] return plaintext
可以如下使用:
key = 'MyKey' text = 'test' encoded = encrypt(key, text) print repr(encoded) # prints 'I+KlvwIK2e690lPLDQMMUf5kfZmdZRIexYJp1SLWRJY=' decoded = decrypt(key, encoded) print repr(decoded) # prints 'test'
为了进行比较,这是PHP的输出,带有相同的文本:
$ php -a Interactive shell php > $key = 'MyKey'; php > $text = 'test'; php > $output = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB); php > $encoded = base64_encode($output); php > echo $encoded; I+KlvwIK2e690lPLDQMMUf5kfZmdZRIexYJp1SLWRJY=