问题标签 [kdf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1041 浏览

c# - 如何在 .net 框架 4.7.1 中使用基于 AES 的 CMAC 作为 PRF 来使用 KDF 计算加密密钥?

我正在尝试使用密钥派生函数从已知的主密钥创建加密密钥。NIST 出版物 800-108 包含使用伪随机函数 (PRF) 推导密钥的建议。本文档定义了几种 KDF 模式。我正在尝试在计数器模式下使用 KDF(如第 5.1 节所述)。这(与本规范中的其他 KDF 模式一样)使用 PRF,根据第 4 节,它可以是 HMAC 或 CMAC。

我有所有的输入 K,标签。可以在计数器模式下进入 KDF 的上下文和 L。我想使用基于 AES 的 CMAC 作为 PRF。

如何使用基于 AES 的 CMAC 在计数器模式下计算 KDF 中的以下步骤(即 PRF(s, x))?

K(i) := PRF (KI, [i]2 || Label || 0x00 || Context || [L]2) 这基本上是 PRF(s, x)

我发现的唯一与 MAC 远程相关的参考是 System.Security.Cryptography.MACTripleDES。

0 投票
1 回答
983 浏览

python - 将 PasswordDeriveBytes 功能转换为 Python

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

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

参数:

示例 POWERSHELL 代码:

结果:

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

蟒蛇代码:

结果:

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

任何帮助将不胜感激。

0 投票
0 回答
1162 浏览

ruby - AES 256 CBC 使用 Ruby 加密,OpenSSL 不起作用

我正在尝试使用密码在 Ruby 中使用 OpenSSL 库加密数据。Ruby 代码如下所示:

不幸的是,当我尝试对此进行解密时,出现错误bad magic number

openssl enc但是,当我通过运行命令在终端中尝试此操作时,它可以工作:

我想我尝试了从密码生成密钥/IV 的所有可能组合,但每次都会出错。有没有人能够发现这种方式的问题在哪里?我花了一整天的时间在这上面。

0 投票
1 回答
996 浏览

java - Bouncy Castle Diffie-Hellman KeyAgreement 与 KDF:什么是用户密钥材料?

Bouncy Castle Diffie-Hellman 文档谈到在从静态长期密钥对派生临时密钥时使用“用户密钥材料”和 KDF。没有提及如何生成此密钥材料。

例如,在 BCFipsIn100.pdf 中,他们有这个例子:

他们的示例对 userKeyingMaterial 使用静态字符串,但一般没有提及这应该是什么。

关于如何生成 userKeyingMaterial 的规范是什么?它可以像他们的示例一样是单个静态字符串,还是本质上是随机数?多长?双方交换公钥时是否可以公开共享?

0 投票
0 回答
87 浏览

erlang - erlang 中是否有用于 X9.63 密钥派生函数的库

有人可以告诉我 Erlang 中是否有用于 X9.63 密钥派生函数的库。我需要生成 keyData 和会话密钥。

0 投票
0 回答
98 浏览

c# - C# 充气城堡 DHKdfParameters extraInfo 不影响结果

我使用充气城堡为 ECDH 和 AES128-GCM 使用密钥推导函数。

所以这是我的代码。

我在这里看到了那个代码。

但 extraInfo 不影响结果。

因为无论 extraInfo 是否有值,结果总是相同的。

new DHKdfParameters(...) 中的 secretZ 值和 keySize 会影响结果。

如何让 extraInfo 影响结果?

0 投票
1 回答
269 浏览

go - 使用 KDF 在 Go 中使用 bcrypt 获取特定的输出密钥长度

看起来 Go 生态系统只有一个基本的 bcrypt 实现(golang.org/x/crypto/bcrypt),开发人员可以练习从编码的输出字符串中提取密钥,然后进一步扩展它以满足特定的需求如果您要将其用作加密密钥,而不是将其作为密码存储在某处的数据库中,则密钥长度。让我感到困惑的是,对于 Go 或一般来说,似乎没有在线上对这个概念进行任何快速处理。

冒着引入错误的风险,我怀疑我将被迫使用scrypt,至少在 Go 中,它确实需要一个输出长度参数。

我错过了什么吗?在 Go 中的某处是否有bcrypt的实现,它采用密钥长度参数并直接管理生成可接受长度的密钥?

0 投票
1 回答
302 浏览

c# - ECDH (secp256r1) + NIST SP 800-56A 使用 .NET 连接 KDF 在 C# 中真的不可能吗?

我知道这里有类似的问题,但我仍然没有找到明确的答案。是否可以在不使用充气城堡的情况下使用具有给定串联功能的 .NET 库派生会话密钥?似乎存在一些差异,因为我在双方都没有获得相同的会话密钥(第二部分:嵌入式实现)。

这就是我目前正在尝试的方式(TempPubKeySCC 是我收到的原始未压缩格式的公钥,ECDHtempPublicKey 将发送给对方):

所以我的问题?有什么问题吗?或者我需要花一些时间在 bouncycastle 上吗?需要使用 secp256r1 和级联 KDF (NIST SP 800-56A)。

非常感谢 =)

问候马茨

0 投票
1 回答
748 浏览

c# - 使用 secp384r1 ECC 算法和 KDFX963 解密消息

我正在尝试使用椭圆曲线密码图 ECDiffieHellman 解密消息,使用 KDFX963 作为密钥派生函数 (KDF)(在 ANSI-X9.63-KDF http://www.secg.org/sec1-v2.pdf中定义)

但我正在努力完成这项工作。我非常需要这样的方法:

有关解密消息的算法的一些额外信息:

  • 椭圆曲线:SECP384R1;命名为Curves.brainpoolP384r1
  • 密码:AES 模式:GCM
  • 密钥大小:32
  • Mac 尺寸 = 16
  • 密钥导出函数:ANSI-X9.63-KDF
  • 哈希:Sha256(长度 32)

我有下面的 Python 代码正在执行解密消息所需的操作,但我需要在 C# 中使用它。

希望有一个密码学天才可以帮助我,或者是“Python To C#”专家。谢谢。

0 投票
1 回答
355 浏览

elliptic-curve - ECIES:KDF的正确ECDH输入方式?安全效果?

为了完全理解 ECIES 并使用我最喜欢的库,我自己实现了 ECIES 的某些部分。这样做并比较结果会导致我不太清楚的一点:KDF 的输入到底是什么?

ECDH的结果是一个向量,但是你用什么来做KDF呢?它只是 X 值,还是 X + Y(可能带有前置 04)?您可以在野外找到这两个概念,并且为了互操作性,哪种方式是正确的方式真的很有趣(如果有正确的方式 - 我知道 ECIE 更像是一个概念并且有几个自由度)。

解释(如果我在特定点上错了,请纠正我)。如果我谈论字节长度,这将指的是具有 256 位 EC 密钥的 ECIES。

所以,首先,大局:这是 ECIES 流程,我说的是第 2 步 -> 第 3 步:

在此处输入图像描述

接收者的公钥是向量 V,发送者的临时私钥是标量 u,密钥协商函数 KA 是 ECDH,它基本上是 V * u 的乘积。结果,您得到了一个共享密钥,它也是一个向量——我们称之为“共享密钥”。

然后获取发送者的公钥,将其与共享密钥连接,并将其用作密钥派生函数 KDF 的输入。

但是:如果您想将此向量用于密钥派生函数 KDF,您有两种方法:

  1. 你可以只使用共享密钥的 X。然后你有一个 32 字节的字节串。
  2. 您可以使用共享密钥的 X 和 Y,并像使用公钥一样在其前面加上 0x04。然后你有一个 01 + 32 + 32 字节的字节串 [3) 只是为了完整:你也可以使用 X + Y 作为压缩点)

字节串的长度并不重要,因为在 KDF(通常涉及散列)之后,您总是有一个固定值,例如 32 个字节(如果您使用 sha256)。

但是,如果您选择其中一种方法,KDF 的结果当然会大不相同。所以问题是:正确的方法是什么?

因此,我试图在文档中获取更多信息:

所以,结果是:我很困惑。谁能指出我正确的方向,或者这只是你拥有的一定程度的自由(以及在兼容性方面有很多乐趣的理由)?