5

我使用以下函数解密服务器上的数据:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

但是,我已经阅读了很多关于不使用 ECB 的内容(并且知道它已被弃用,因此想切换到 CBC。只需将模式切换为:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND)));
}

但是不起作用。不会产生错误,但返回的数据仍然是加密的。

我错过了什么?

更新的代码 - 仍然有错误:

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}


function decrypt($key, $text) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}


$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text);
echo "AES Number : " . $encrypted . "<br><br>";

echo "Plain Number : ". decrypt($key, $encrypted) . "<br><br>";

这应该工作 - 但它返回错误:

块大小

blocksize in> 警告:mcrypt_encrypt()

[function.mcrypt-encrypt]:IV参数必须和blocksize inblocksize一样长

块大小

4

3 回答 3

7

解密时需要使用与加密时相同的 IV。看起来您在解密期间正在生成一个新的随机 IV。

可以将 IV 附加或添加到密文中。IV 不是秘密的,但它们对于每条加密消息应该是唯一的,并且只能使用一次。

于 2010-11-10T22:19:06.130 回答
5

您更新的代码存在一个问题,$iv即在相应的编码/解码函数中不可用的全局变量:

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text, $iv) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}

function decrypt($key, $text, $iv) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}

$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text, $iv);
echo "AES Number : " . $encrypted . "<br><br>";

echo "Plain Number : ". decrypt($key, $encrypted, $iv) . "<br><br>";

$iv或者您仍然可以通过将全局导入本地函数范围来依赖它:

function encrypt($key, $text) {
    global $iv; // or use $GLOBALS['iv] instead of $iv in the call below
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}

function decrypt($key, $text) { 
    global $iv; // or use $GLOBALS['iv] instead of $iv in the call below
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}

但这肯定不是推荐的做法,因为它将您的代码与全局变量耦合。

于 2010-11-11T08:09:05.727 回答
3

您在加密此文本时是否也更改了模式?

另外,在使用MCRYPT_MODE_CBC时,需要在加解密时使用相同的key和IV。随机 IV 不适用于 CBC。

于 2010-11-10T22:20:37.467 回答