如何将Java SecretKeyFactory.generateScret()移植到Python?

如何将Java SecretKeyFactory.generateScret()移植到Python?,java,python,cryptography,porting,pbkdf2,Java,Python,Cryptography,Porting,Pbkdf2,我在Java中有这样的陈述: SecretKeyFactory.getInstance("PBEWITHSHAAND256BITAES-CBC-BC").generateSecret(new PBEKeySpec(password, salt, 37, 128)).getEncoded() 我需要这个来处理Python。有办法吗 我试过PBKDF2HMAC,但我想那是另一种算法 kdf = PBKDF2HMAC(algorithm=hashes.SHA1, length=length, sal

我在Java中有这样的陈述:

SecretKeyFactory.getInstance("PBEWITHSHAAND256BITAES-CBC-BC").generateSecret(new PBEKeySpec(password, salt, 37, 128)).getEncoded()
我需要这个来处理Python。有办法吗

我试过PBKDF2HMAC,但我想那是另一种算法

kdf = PBKDF2HMAC(algorithm=hashes.SHA1, length=length, salt=bytes.fromhex(salt), iterations=iter, backend=default_backend())
key = kdf.derive(password.encode('utf-8'))

这里的答案有帮助吗?密码中是否有特殊字符,或者它们都在ASCII字符集中?我对
PBEKeySpec
中提到的
256biates
和最后一个参数128感到有点惊讶。如果我没有弄错的话,最后一个参数意味着创建一个128位的密钥,这当然与AES-256不兼容。您是如何测试结果是否正确的?@Maarten Bodewes,我也注意到了这个奇怪的键大小不兼容。密码-125 ASCII字符,salt-128字节。Java中的结果键-256位/32字节长。我假设算法256重写了PBEkeySpec128。PBKDF2HMAC的密钥在16或32版本中具有相同的前16字节。它们与Java不同。@kar,thx,但我已经尝试过这个算法,但没有成功。这个Python实现与SHA1结合可能会对您有所帮助。该代码是为PyCrypto编写的,但可以轻松地移植到PyCryptodome。实现基于算法,第B.1节。和B.2。在我的测试中,结果相当于Java代码的结果。但它必须进行更详细的测试。这里的答案有帮助吗?密码中是否有特殊字符,或者它们都在ASCII字符集中?我对
PBEKeySpec
中提到的
256biates
和最后一个参数128感到有点惊讶。如果我没有弄错的话,最后一个参数意味着创建一个128位的密钥,这当然与AES-256不兼容。您是如何测试结果是否正确的?@Maarten Bodewes,我也注意到了这个奇怪的键大小不兼容。密码-125 ASCII字符,salt-128字节。Java中的结果键-256位/32字节长。我假设算法256重写了PBEkeySpec128。PBKDF2HMAC的密钥在16或32版本中具有相同的前16字节。它们与Java不同。@kar,thx,但我已经尝试过这个算法,但没有成功。这个Python实现与SHA1结合可能会对您有所帮助。该代码是为PyCrypto编写的,但可以轻松地移植到PyCryptodome。实现基于算法,第B.1节。和B.2。在我的测试中,结果相当于Java代码的结果。但它必须进行更详细的测试。