0

我们想了解更多关于函数 get_rnd_iv() 和 md5_encrypt() 的信息,这些函数使用 128 位编码。现在在这里我们只想知道如何将该代码解码为纯文本......

这是我所有的代码行..

function get_rnd_iv($iv_len)
{
   $iv = '';
   while ($iv_len-- > 0) {
       $iv .= chr(mt_rand() & 0xff);
   }
   return $iv;
}

function md5_encrypt($plain_text, $password, $iv_len = 16)
{
   $plain_text .= "\x13";
   $n = strlen($plain_text);
   if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
   $i = 0;
   $enc_text = get_rnd_iv($iv_len);
   $iv = substr($password ^ $enc_text, 0, 512);
   while ($i < $n) {
       $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
       $enc_text .= $block;
       $iv = substr($block . $iv, 0, 512) ^ $password;
       $i += 16;
   }
   return base64_encode($enc_text);
}

function md5_decrypt($enc_text, $password, $iv_len = 16)
{
   $enc_text = base64_decode($enc_text);
   $n = strlen($enc_text);
   $i = $iv_len;
   $plain_text = '';
   $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
   while ($i < $n) {
       $block = substr($enc_text, $i, 16);
       $plain_text .= $block ^ pack('H*', md5($iv));
       $iv = substr($block . $iv, 0, 512) ^ $password;
       $i += 16;
   }
   return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}
?>
4

2 回答 2

4

我们想了解更多关于函数 get_rnd_iv() 和 md5_encrypt()

但是你不说你想知道什么!

有一个_encrypt()和一个_decrypt()- 有什么问题?

我不是密码分析家——但函数的名字很糟糕——md5 是散列函数而不是加密函数——即 md5 的目的是使数据不可解密——当然,这个对称算法使用的是 md5 函数——但它不只实现 md5。

IV 的意义在于,用相同的密钥加密相同的消息会产生不同的输出(从而使重放攻击和密钥识别更加困难)。注意需要为加密生成IV,并将相同的值传递给解密fn。对于您提供的代码,它被合并到输出中 - 但可以单独处理。

我可能是错的,但这里的算法看起来像是WEP的变体

于 2011-06-28T08:55:44.283 回答
2

我可能不完全理解您的问题,但就加密和解密而言,您在此处使用该代码要求的是:

$plain_text = 'Hello World';
$password = 'bb98x! jKl\'5#}';
$enc_text = md5_encrypt($plain_text, $password);
$text = md5_decrypt($enc_text, $password);
var_dump($plain_text, $enc_text, $text);

输出:

string(11) "Hello World"
string(44) "52tXWp087mLYL/Rd1z8Bbb8sQbE+pp2+tlY95UCmkqc="
string(11) "Hello World"

这似乎很明显,我不知道这是否真的是你所要求的。

于 2011-06-28T08:09:04.457 回答