簡體   English   中英

PHP使用密碼和鹽獲取C#Rfc2898DeriveBytes(AES256)的IV和密鑰替代

[英]PHP use password and salt to get IV and Key alternative to C# Rfc2898DeriveBytes (AES256)

我想從存儲的密碼和鹽中重新生成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);

在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編碼的字符串進行Base64解碼,這通常會失敗。 實際上是Base64解碼肌炎”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM