首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ED25519种子安全地派生AES和ED25519密钥

从ED25519种子安全地派生AES和ED25519密钥
EN

Cryptography用户
提问于 2019-11-08 20:49:47
回答 1查看 1.3K关注 0票数 1

Go的ed25519包公开了一个函数,该函数允许从32字节种子创建私钥。

请参阅:https://godoc.org/golang.org/x/crypto/ed25519#NewKeyFromSeed

我之所以要使用它,是因为它只有32个字节,因此很容易复制和传递。

我假设如果我为种子使用密码安全的随机源,我在ed25519密钥的安全性方面应该是安全的。

(理想情况下,如果可以的话,我会做得更小,而不会在安全问题上妥协)。

现在,我想从我已经拥有的32个字节(或者种子生成的pub/priv密钥)中派生一个AES密钥来进行加密。

我希望任何拥有种子(或私钥)的人都能这样做。

现在可能有三种类型的客户:

  1. 拥有种子/私钥的客户端,这些客户端能够派生AES密钥,对加密数据进行加密和签名。(私钥或种子需要32字节)
  2. 拥有公钥并能够验证数据的客户端没有被篡改,但无法解密数据。(公开密钥需要32字节)
  3. 拥有公钥和AES密钥的客户端,这些客户端能够验证和解密数据,但无法自己签名(需要64字节,32字节用于公钥,32用于aes密钥)

为此,我如何安全地导出AES密钥?

我的直觉是在pbkdf2密钥的私有部分使用ed25519来生成AES密钥,但我不确定它是否削弱了安全性。

在种子上使用pbkdf2会使安全性受到更大的损害吗?

EN

回答 1

Cryptography用户

发布于 2019-11-08 21:14:11

您应该选择一个基于密钥的密钥派生函数,例如HKDF 256.然后:

  1. 随机一致地生成主密钥k
  2. 从Ed25519种子k_0通过k_0 = \operatorname{HKDF-Expand}_k(\text{info=‘Ed25519 signing key’},\, \text{size=32 bytes}).派生出一个种子
  3. k_1中通过k_1 = \operatorname{HKDF-Expand}_k(\text{info=‘AES encryption key’},\, \text{size=32 bytes}).导出AES密钥
  4. 为任何其他目的派生出您想要的任何其他密钥--甚至可能是其他的Ed25519或AES密钥,只是为了不同的目的--使用具有相同主键和不同info参数的提取器,用于每个不同的目的。

您可以根据需要组织树,以便分发具有部分权限的子树,比如签名的权限(发出k_0,而不是kk_1),或者加密/解密的权限(发出k_1,而不是kk_0)。

任何其他合理的键控XOF,如SHA-3的KMAC128或键控BLAKE2x,也将提供服务。具有固定长度的输出(如HMAC 256或键控BLAKE2s )的函数在您需要的情况下稍微少了一些,例如,由于某种原因,64字节键而不是32字节密钥;HKDF是将这些键转换为可变长度输出的通用方法。HKDF还包括一个可选的初始步骤,HKDF-提取,将非均匀但高熵的种子(如计算机生成的BIP39密码)转换为有效的统一随机主密钥。

不需要基于密码的密钥派生函数(或者仅仅是“密码散列”),比如PBKDF2,因为输入--您的32字节主键--已经是一个统一的随机位字符串。您真正需要的是派生子键--k_0k_1等--它们显然是独立的。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/75614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档