PHP SHA1 vs PasswordDeriveBytes SHA1 - 不同的长度


PHP SHA1 vs PasswordDeriveBytes SHA1 - differing lengths

在这些帖子上阅读了这个问题(仅举两例(......

在 vb.net 中加密/解密并不总是返回相同的值

C# 密码派生字节混淆

。我想知道是否有人知道Microsoft用来键拉伸输出的方法?

为了与其他人用 C# 编写的系统集成,我需要在 PHP 中生成一个大哈希。 生成其 SHA1 哈希的代码生成 32 字节输出,而不是标准的 20 字节 SHA1 输出。 那么有没有人破解Microsoft如何填充剩余的 12 个字节? 我已经尝试了很多附加盐的 SHA1、密码等以及附加以前的迭代的组合,但似乎没有任何内容产生 Microsoft 的输出。

我对 https://stackoverflow.com/a/13482133/4346051 的评论有点担心...

"PasswordDeriveBytes 使用未知的、专有的、非确定的、破碎的、 密码派生字节的加密不安全密钥拉伸方法">

示例代码如下...

我需要在 PHP 中复制的 C# 代码,以便生成正确的哈希以与第三方软件集成:

string sPassword = "iudF98yfh9aRfhanifakdfn0a4ut-a8J789jasdpasd=";
string sSalt = "lYU7m+MDCvVWVQyuLIX3og==";
int iLength = 256 / 8;
byte[] saltInBytes = Encoding.ASCII.GetBytes(sSalt);
PasswordDeriveBytes password = new PasswordDeriveBytes(sPassword, saltInBytes, "SHA1", 2);
byte[] keyBytes = password.GetBytes(iLength);
Console.WriteLine("'nkeyBytes = 'n");
foreach (byte value in keyBytes)
{
    Console.WriteLine(value);
}

。哪些输出...

0
176
172
127
35
113
212
85
123
19
71
65
23
127
84
165
163
225
80
207
67
125
128
205
188
248
103
52
23
245
111
20

我相同功能的 PHP 代码是...

$sPassword = "iudF98yfh9aRfhanifakdfn0a4ut-a8J789jasdpasd=";
$sSalt = "lYU7m+MDCvVWVQyuLIX3og==";
$iIterations = 2;
$iLength = 256 / 8;
// combine password with salt
$key = $sPassword.$sSalt;
// perform sha1 how ever many times, using raw binary output instead of hex
for($i = 1; $i <= $iIterations; $i++) { 
    $key = sha1($key, true); 
}
// get the iLength number of chars
$key = substr($key, 0, $iLength);
$aKeyBytes = unpack('C*', $key);
print_r($aKeyBytes); 

。这输出...

Array
(
    [1] => 0
    [2] => 176
    [3] => 172
    [4] => 127
    [5] => 35
    [6] => 113
    [7] => 212
    [8] => 85
    [9] => 123
    [10] => 19
    [11] => 71
    [12] => 65
    [13] => 23
    [14] => 127
    [15] => 84
    [16] => 165
    [17] => 163
    [18] => 225
    [19] => 80
    [20] => 207
)

。但正如你所看到的,我们短了12个"字节"。

不幸的是,它必须被复制 - 我无法修改 C# 以使用更好的方法 - 我无法控制那一边 - 我的 PHP 代码必须生成它

我需要或多或少相同的东西 - 使用PHP AES256-CBC加密的数据,我需要能够使用VB代码解密。

我花了一段时间来搜索互联网并测试各种代码示例,但我能够使用以下帖子中的信息使其工作:

  • C#/VB代码在这里
  • 如何将此 C# Rijndael 加密转换为 PHP?

亲切问候

斯文