我们希望了解更多关于函数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);
}
?>
答案 0 :(得分:4)
我们想了解更多关于函数get_rnd_iv()和md5_encrypt()
的信息
但是你没有说出你想知道的是什么!
有_encrypt()
和_decrypt()
- 问题是什么?
我不是cryptoanalyst - 但功能名称非常糟糕 - md5是一个散列函数而不是加密函数 - 即md5的目的是使数据不可解密 - 当然这种对称算法使用的是md5函数 - 但它没有实现md5。
IV的要点是使用相同的密钥加密相同的消息会产生不同的输出(因此使得重放攻击和密钥识别更加困难)。注意,需要为加密生成IV,并将相同的值传递给解密fn。对于您提供的代码,它将被合并到输出中 - 但可以单独处理。
我可能错了,但这里的算法看起来像是WEP
的变体答案 1 :(得分: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"
这似乎很明显,如果那真的是你所要求的,我就不知道了。