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