#密钥派生 #密钥 #私钥 #参考 #派生密钥 #素数

bin+lib msecret

纯 Rust 编写的 MSecret 密钥派生参考实现。包括一个有用的命令行工具

3 个版本

0.1.2 2023年7月8日
0.1.1 2023年7月7日
0.1.0 2023年7月4日

#1373密码学

Apache-2.0

205KB
4K SLoC

MSecret — 实验性密钥派生工具

crates.io Build Status Documentation dependency status MSRV


此项目包括以下内容

  1. 一个用于从对称主密钥确定性派生各种类型数据(字节、整数、素数等)和加密密钥(RSA、ECC等)的规范(包括测试向量)。
  2. 一个用 Rust 编写的参考实现,包括一个有用的命令行工具

⚠️ 警告 ⚠️

使用此项目自行承担风险。与任何实验性和加密相关的项目一样,在使用此项目之前,有一些注意事项需要了解

⚠️ 行为可能更改 ⚠️

MSecret 规范和包含的参考实现应被视为实验性和可能更改,直到规范被宣布为最终版本。 对派生规范的任何更改都将改变最终密钥的输出。 此外,对规范实现的任何错误也可能导致错误的结果。

如果您需要确保从包含的参考工具派生的任何密钥在后续版本中始终派生到相同的密钥,您应避免在此规范和测试向量最终确定之前使用此软件。

⚠️ 未审计 ⚠️

参考源代码和测试向量均未经过正确性审计。

⚠️ 漏洞攻击 ⚠️

参考源代码未针对旁路攻击加固。

工作原理

在 MSecret 中,密钥定义为 256 位长。MSecret 规范定义了从 256 位密钥确定性派生各种类型加密密钥(RSA、EC 等)和其他值(整数、伪随机字节字符串等)的方法。

除了派生加密密钥和其他值外,还定义了一种从“标签”派生其他 256 位密钥的方法。这些派生可以链接在一起形成“密钥路径”,从而允许派生密钥的分层结构。这允许复杂的域分离形式。

定义的伪随机派生

  1. 通过标签/密钥路径的 256 位对称密钥
  2. 任意长度的字节字符串
  3. 最大值的整数
  4. 给定位长的素数
  5. 给定位长的 RSA 公共/私有密钥
  6. 任意曲线的ECC公钥/私钥,包括Ed25519和X25519
  7. 各种密码风格
  8. 比特币地址及其关联的私钥

秘密管理

秘密可以随机生成,或通过argon2id从口令派生。秘密还可以分成任意数量的“份额”,从中可以选取一部分来恢复秘密(m-of-n秘密共享)。

密钥路径

密钥路径是一系列由斜杠("/")分隔的标签字符串,使其看起来像文件系统中的路径:即 "/A/1/CA/com.example/2023-06-23"。密钥派生是分层进行的,因此路径 "/A/1" 中的秘密可以被导出并在以后用于派生 "CA/com.example/2023-06-23" 中的秘密。

支持通过特殊表示法支持同一标签的链。以下密钥路径都是等价的

  • /x/x/x/x
  • /x@4
  • /x/x@3
  • /x@2/x@2

命令行工具

要安装命令行工具 msecretctl,首先确保您的rust开发环境已安装且最新。从头开始安装,请参阅此处的说明。要更新现有安装,请使用rustup。

$ rustup update

然后您可以获取 msecretctl 的最新版本。

$ cargo install msecret

现在您应该能够使用 msecretctl 工具。

使用示例

包含的参考实现包括一个名为 msecretctl 的命令行实用程序,可用于派生各种秘密。它有一个交互模式,可以通过简单地运行它进入。

以下是一个使用该工具生成新的根秘密并将其分成5个份额(其中任何三个都可以重建它)的示例

$ cargo build --release
$ target/release/msecretctl

> secret generate
Created XvvjqeUihQncbhsVQBtToB

/> secret share 3 5
ARhqDQyLeN1K92xHxYkWhVHbGRsjLdduhPDPT6L2FsroNfT
ErtgQEvsXKA9TgYRnjqE2s4NFhwbPd4e5YVwDU3X6cCDoZ9
NvBfSVbkqmN37jxa8689S8htmPXnxaqvdH13FkaDLaAdWb3
Sf1GNofy4vvij3Z4uziDuxuc54ZSGiwY9MQ9fJQcWdkLSEi
aL1RKsJPN9ZsSPhifiJGz5PSB35HRTy7kNitYYHw8LAEUHA

然后我们继续派生X.509证书的两个私钥

/> cd /A/1/CA/com.example/2023-06-23

/A/1/CA/com.example/2023-06-23> ecc private prime256v1
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIP9sNI1FKOOT0Pm56bpbXAP/aQiCu+nlXus1OcZYlt4xoAoGCCqGSM49
AwEHoUQDQgAE1YGpnNePZH5u6apTZpUP7/9W1xaJ8x5JNxqPxyh8gf6B2xStFB7q
UIVkSB54IZGHuuQKkYwfCjT69zDGVRwt7A==
-----END EC PRIVATE KEY-----

/A/1/CA/com.example/2023-06-23> cd ../../net.example.com/2023-06-23

/A/1/CA/net.example/2022-00-21> ecc private prime256v1
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIBDh1+5kobZT/IuuLx3KyLsaFqSF7WDVAC91/Ih9LzpeoAoGCCqGSM49
AwEHoUQDQgAEU3lNhlWMkmVN6MEbWFIbCRH9uE4I5bxt+WSHn/vUpk9weJ/LJ4vt
q9Wc+L1K/7QKbkJ2T0S+0PsNfQWWN2aDog==
-----END EC PRIVATE KEY-----

/A/1/CA/net.example/2022-00-21> exit

$

如果我们以后需要恢复这些私钥,我们可以使用上述份额中的任意三个来恢复密钥

$ target/release/msecretctl

> secret recover
Enter Share: Sf1GNofy4vvij3Z4uziDuxuc54ZSGiwY9MQ9fJQcWdkLSEi
Enter Share: ARhqDQyLeN1K92xHxYkWhVHbGRsjLdduhPDPT6L2FsroNfT
Enter Share: NvBfSVbkqmN37jxa8689S8htmPXnxaqvdH13FkaDLaAdWb3
Enter Share:
Imported XvvjqeUihQncbhsVQBtToB

/> cd /A/1/CA/com.example/2023-06-23

/A/1/CA/com.example/2023-06-23> ecc private prime256v1
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIP9sNI1FKOOT0Pm56bpbXAP/aQiCu+nlXus1OcZYlt4xoAoGCCqGSM49
AwEHoUQDQgAE1YGpnNePZH5u6apTZpUP7/9W1xaJ8x5JNxqPxyh8gf6B2xStFB7q
UIVkSB54IZGHuuQKkYwfCjT69zDGVRwt7A==
-----END EC PRIVATE KEY-----

/A/1/CA/com.example/2023-06-23>

您还可以仅导出/分享 /A/1 中的密钥...

/A/1/CA/com.example/2023-06-23> cd /A/1

/A/1> secret id
EhK8TqdqrJ6xBaxEYx2mmb

/A/1> secret share 2 3 -f words
light-conan-flame--valid-input-poncho--bronze-falcon-jacob--piano-frame-popular--ticket-sharp-smoke--burger-status-father--cobra-ship-marion--water-shake-alien--except-private-fax
saint-queen-video--elite-martin-amber--canal-ferrari-jamaica--escape-soprano-dinner--honey-food-infant--paper-george-jumbo--cotton-vision-madonna--radio-rodent-episode--rainbow-citizen-ego
sonata-tropic-mask--voice-edgar-cool--cotton-reptile-alien--meaning-carol-common--dynasty-joker-bamboo--poker-educate-random--lion-nova-demand--smile-escort-kilo--basket-ocean-fax

/A/1> q

$

...然后从这个密钥中派生ECC密钥

$ target/release/msecretctl

> secret recover
Enter Share: sonata-tropic-mask--voice-edgar-cool--cotton-reptile-alien--meaning-carol-common--dynasty-joker-bamboo--poker-educate-random--lion-nova-demand--smile-escort-kilo--basket-ocean-fax
Enter Share: light-conan-flame--valid-input-poncho--bronze-falcon-jacob--piano-frame-popular--ticket-sharp-smoke--burger-status-father--cobra-ship-marion--water-shake-alien--except-private-fax
Enter Share:
Imported EhK8TqdqrJ6xBaxEYx2mmb

/> cd CA/com.example/2023-06-23

/CA/com.example/2023-06-23> ecc private prime256v1
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIP9sNI1FKOOT0Pm56bpbXAP/aQiCu+nlXus1OcZYlt4xoAoGCCqGSM49
AwEHoUQDQgAE1YGpnNePZH5u6apTZpUP7/9W1xaJ8x5JNxqPxyh8gf6B2xStFB7q
UIVkSB54IZGHuuQKkYwfCjT69zDGVRwt7A==
-----END EC PRIVATE KEY-----

/CA/com.example/2023-06-23>

未来工作

  • 最终规范
  • 带权限的智能卡支持
  • 密钥路径映射
  • 额外的非对称密钥格式

许可

Apache 2.0;有关详细信息,请参阅LICENSE

依赖关系

~9–25MB
~364K SLoC