PHP 使用密码和盐来获取 IV 和 Key 替代 C# Rfc2898DeriveBytes (AES256)

本文关键字:Rfc2898DeriveBytes 替代 AES256 Key 获取 密码 PHP IV | 更新日期: 2023-09-27 18:36:28

我想从我存储的密码和盐中重新生成我的 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和键:

<?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);

PHP 使用密码和盐来获取 IV 和 Key 替代 C# Rfc2898DeriveBytes (AES256)

在 PHP 中,Base64 解码盐,但它不是 base64 编码的:
base64_decode($salt)

在 C# 中,你只得到盐的字节数:
byte[] Salt = Encoding.UTF8.GetBytes(random_string_salt);

在 PHP 中,您使用的是 SHA256
在 C# 中,您使用的是使用 SHA1 的 MSN Rfc2898DeriveBytes:
Rfc2898DeriveBytes 类指定:使用基于 HMACSHA1 的伪随机数生成器。
password bytes上使用 SHA256 不会修复 MSN rfc2898derivebytes。这是一个 MSN 问题,因为它不允许指定 HAMC。

解决方案是更改PHP以仅获取字符串字节作为数据,而不是尝试Base64解码未按Base64编码的内容。

  1. 至少在每种语言中做同样的事情
  2. 如果您需要使用 MSN Rfc2898DeriveBytes,请将 PHP HMAC 更改为 SHA1。
  3. 不要 Base64
  4. 解码未使用 Base64 编码的字符串,这通常会失败。事实上Base64解码的肉豆螨炎"
相关文章:
  • 没有找到相关文章