PHP pbkdf2的结果与C#rfc2898derivebytes不一样

时间:2017-07-14 20:15:35

标签: c# php

我正在尝试在php中解密我的C#加密内容,我正在逐步执行此操作,以便我可以跟踪所有内容。我开始用钥匙和iv。

我的C#代码:

        string PKey = "12345678";
        string salt = "C326EBD1113438B1715AB1B5A1817";
        byte[] bytesKey = Encoding.UTF8.GetBytes(PKey);
        bytesKey = SHA256.Create().ComputeHash(bytesKey);

        textBox4.Text = Convert.ToBase64String(bytesKey); //hash

        byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
        var key = new Rfc2898DeriveBytes(bytesKey, saltBytes, 1000);

        byte[] keyKey = key.GetBytes(256 / 8);
        byte[] ivKey = key.GetBytes(128 / 8);

        textBox5.Text = Convert.ToBase64String(keyKey); //key
        textBox6.Text = Convert.ToBase64String(ivKey); //iv

我的PHP代码:

$pass = "12345678";
$newpass = "";
$salt = "C326EBD1113438B1715AB1B5A1817";
$hasher = "SHA1";
$iterations = 1000;
$keysize = 256;
$ivsize = 128;

$newpass = hash("sha256",mb_convert_encoding($pass,"UTF-8"),true);


$out = hash_pbkdf2($hasher, $newpass, $salt, $iterations, ($keysize+$ivsize)/8, true);

$key = substr($out, 0, $keysize/8);
$iv = substr($out, $ivsize/8);


echo "hash: " .base64_encode($newpass);
echo "<br>";
echo "key: " . base64_encode($key);
echo "<br>";
echo "iv: " . base64_encode($iv);

在尝试了几乎所有的东西之后,这些是我能得到的最好结果:

C#:

hash: 73l8gRjwLftklgfdXT+MdiMEjJwGPVMsyVxe16iYpk8=
key: WOqyVBejGMkYIwO0OafALN+U4qBBwM7sVQtlyXpPwyo=
iv: F8jyzVIGdVlIwP/IlkfPFg==

PHP:

hash: 73l8gRjwLftklgfdXT+MdiMEjJwGPVMsyVxe16iYpk8=
key: WOqyVBejGMkYIwO0OafALN+U4qBBwM7sVQtlyXpPwyo=
iv: 35TioEHAzuxVC2XJek/DKhfI8s1SBnVZSMD/yJZHzxY=

如您所见,只有iv实际上不同,哈希和密钥是相同的。

有谁知道为什么iv不同?

更新:

替换base64_encode($ iv);使用base64_encode(mb_convert_encoding($ iv,“UTF-8”));

给我这个iv: 35Q / QT8 / P1ULZT96Tz8qFz8 / P1IGdVlIPz / Ilkc /蛋白原==

如果我没弄错的话,这里包含了C#iv ...

的部分内容

0 个答案:

没有答案