gpt4 book ai didi

php - 在 Python 中解密用 PHP 中的 MCRYPT_RIJNDAEL_256 加密的字符串

转载 作者:IT王子 更新时间:2023-10-29 00:12:03 24 4
gpt4 key购买 nike

我在 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 版本。一个可以查到here .然后您将需要模拟 PHP Mcrypt 模块中使用的 key 和文本填充。他们添加 '\0' 以将文本和键填充到正确的大小。他们使用的是 256 位 block 大小,并且与您提供的 key 一起使用的 key 大小是 128(如果您给它一个更大的 key ,它可能会增加)。不幸的是,我链接到的 Python 实现一次只能编码一个 block 。我已经创建了 python 函数来模拟 Python 中的加密(用于测试)和解密

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=

关于php - 在 Python 中解密用 PHP 中的 MCRYPT_RIJNDAEL_256 加密的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com