我正在使用以下内容.NET代码从密码和salt生成密钥:

static byte[] GenerateKey(string password, string salt, int size)
{
    var saltBytes = Encoding.Unicode.GetBytes(salt);
    var derivedBytes = new Rfc2898DeriveBytes(password, saltBytes, iterations);
    var key = derivedBytes.GetBytes(size);

    Console.WriteLine(string.Format("Key: {0}", Convert.ToBase64String(key)));

    return key;            
}

// Console.Writeline() shows 
// Key: tb6yBBYGdZhyFWrpWQ5cm5A1bAI5UF0KnDdom7BhVz0= 
// for password="password" and salt="salt"

我需要使用python解码编码的消息,python是一种我只稍微熟悉的语言,使用相同的密码和salt.多亏了@Topaco,我现在知道有PBKDF2 equivalent个:

def decrypt_file(filename, password, salt):

    key = PBKDF2(password, salt, 32, count=12345, hmac_hash_module=SHA1)

  print(f"Key: {base64.b64encode(key).decode('utf-8')}");
  # more lines redacted 
 
# print() shows
# Key: 3ohW9ctQIXoNvGnvLaKmoQTG8/jJzoFThviHXqgM9Co=
# for password="password" and salt="salt"

我在从两个实现中获取相同的密钥时遇到了一些问题.我not岁,精通python的编码和解码;很可能是am生成了相同的键,但base64.b64encode(key).decode('utf-8')行显示了不同的翻译.

我做错了什么?

推荐答案

你必须用UTF-16LE编码盐,因为Encoding.Unicode对应UTF-16LE.剩下的很好:

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

password = b'password'
salt = 'salt'.encode('utf-16le')
key = PBKDF2(password, salt, 32, count=12345, hmac_hash_module=SHA1)
print(base64.b64encode(key).decode('utf-8')) # tb6yBBYGdZhyFWrpWQ5cm5A1bAI5UF0KnDdom7BhVz0=

Python相关问答推荐

如何循环循环的每个元素并过滤掉Python rame中的条件

从多行文本中提取事件对

如何在不使用字符串的情况下将namedtuple属性传递给方法?

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

如何使用bs 4从元素中提取文本

DuckDB将蜂巢分区插入拼花文件

使用LineConnection动画1D数据

Pystata:从Python并行运行stata实例

有症状地 destruct 了Python中的regex?

如何获取TFIDF Transformer中的值?

计算组中唯一值的数量

numpy卷积与有效

如何让这个星型模式在Python中只使用一个for循环?

递归访问嵌套字典中的元素值

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

CommandeError:模块numba没有属性generated_jit''''

基于行条件计算(pandas)

如何在BeautifulSoup/CSS Select 器中处理regex?

找到相对于列表索引的当前最大值列表""