【发布时间】:2016-06-09 01:51:33
【问题描述】:
我想从我存储的密码和盐中重新生成我的 IV 和密钥。 在我的 C# 程序中,我按以下方式进行操作:
//passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
PHP 返回的代码是返回不同的 IV 和 Key:
<?php
include("enctest_inc.php");
$password = "mypassword";
$salt = "mysalthereitis";
$hasher = "SHA256";
$iterations = 1000;
$keysize = 256;
$ivsize = 128;
$out = pbkdf2($hasher, $password, base64_decode($salt), $iterations, ($keysize+$ivsize)/8, true);
// split key and IV
$key = substr($out, 0, $keysize/8);
$iv = substr($out, $ivsize/8);
// print for demonstration purposes
echo base64_encode($key);
echo "<br>";
echo base64_encode($iv);
echo '<br>';
echo '<br>';
echo 'KEY : LNY893Wa00onNQh4ignFdjaVkg6GdxomMZoR/axB+Mw='; //KEY FROM SSH PROGRAM WHICH IS THE RIGHT RETURN;
echo '<br>';
echo 'IV : //QxQj7PDMRE1YUVo+mJvQ==' //IV FROM SSH PROGRAM WHICH IS THE RIGHT RETURN;
我真的很想知道问题出在哪里或如何调试?
PHP 和 C# 中的设置相同:
PHP 代码:
$hasher = "SHA256";
$iterations = 1000;
$keysize = 256;
$ivsize = 128;
C#代码:
string random_string_pwd = "mypassword";
byte[] passwordBytes = Encoding.UTF8.GetBytes(random_string_pwd);
//var random_salt = new ClientTools();
//string random_string_salt = random_pwd.RndStrings(15);
string random_string_salt = "mysalthereitis";
byte[] Salt = Encoding.UTF8.GetBytes(random_string_salt);
// Hash the password with SHA256
passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
【问题讨论】:
-
你能给出一些输出字符串的例子吗?
标签: c# php cryptography pbkdf2