0

我正在尝试使用 pycryptodome 的 KDF 模块在 python 中重新创建 PowerShell 的 PasswordDeriveBytes 方法。

我现在无法通过的主要事情是在 Python 中获得正确的 DerivedKey 结果,这是我从 PowerShell 获得的。

参数:

password = '1234567890'
salt = '0987654321'
length = 16
iterations = 2

示例 POWERSHELL 代码:

$AsciiEncoder = New-Object System.Text.ASCIIEncoding;
$DerivedPass = New-Object System.Security.Cryptography.PasswordDeriveBytes('1234567890', $AsciiEncoder.GetBytes('0987654321'), "SHA1", 2);
[Byte[]] $KeyBytes = $DerivedPass.GetBytes(16);
-join($KeyBytes | ForEach { $_.ToString("X2")});

结果:

C937511EBDBE12C7A0FCC8D6CB42BEDC 

*注意:上面的 PowerShell 代码是从https://github.com/PowerShellMafia/PowerSploit/blob/master/ScriptModification/Out-EncryptedScript.ps1修改的。我正在尝试在下面的 Python 代码中重新实现该功能。

蟒蛇代码:

from Crypto.Protocol import KDF
from Crypto.Hash import SHA1

def password_derive_key(password, salt, length, count):
    return KDF.PBKDF2(password, salt, length, count)

def main():
    derivedKey = password_derive_key('1234567890', '0987654321', 16, 2)
    print derivedKey.encode('hex')

if __name__ == "__main__":
    main()

结果:

5a3f103f5dc4558f8dca5d5b145ed0b4

我能想到的唯一一件事是 PasswordDeriveBytes 的“.GetBytes”方法生成的结果与 pycryptodome 的 KDF 模块不同。

任何帮助将不胜感激。

4

1 回答 1

0

参数需要相同,在问题代码中迭代不同:

POWERSHELL 迭代次数:2
System.Security.Cryptography.PasswordDeriveBytes('1234567890', $AsciiEncoder.GetBytes('0987654321'), "SHA1", 2);

Python 迭代次数:1000
derivedKey = password_derive_key('1234567890', '0987654321', 16, 1000)

确保每个都使用正确的编码。

注意:使用函数作为参数会使调试更加困难,例如:$AsciiEncoder.GetBytes('0987654321').

于 2018-04-20T03:01:28.940 回答