#key #encryption #garbage #shared-key #shared-secret #protocols #p2p

无std bip324

BIP 324 规定的比特币 P2P 协议上的加密消息

4 个版本 (2 个重大变更)

0.3.1 2024 年 6 月 4 日
0.3.0 2024 年 5 月 25 日
0.2.0 2024 年 4 月 18 日
0.1.0 2024 年 2 月 28 日

#2567魔法豆

Download history 201/week @ 2024-05-24 174/week @ 2024-05-31 28/week @ 2024-06-07 2/week @ 2024-06-14 13/week @ 2024-08-02 184/week @ 2024-08-09

每月 197 次下载

自定义许可

120KB
2K SLoC

协议

爱丽丝和鲍勃通过相互发送三条消息来建立连接,以生成多个共享密钥。爱丽丝通过在典型的比特币曲线 secp256k1 上生成公钥/私钥对来开始连接。爱丽丝被称为 发起者。她将公钥编码为 Elligator Swift 格式(64 字节),可选地用一些随机垃圾字节填充,并将消息发送给鲍勃。鲍勃被称为 响应者,解码 Elligator Swift 公钥,并自己生成一个临时的公钥/私钥对。使用他的公钥和私钥,以及爱丽丝的公钥,鲍勃执行椭圆曲线迪菲-赫尔曼算法的变体来生成共享密钥。从这个共享密钥中,鲍勃使用 HKDF 算法生成多个密钥和一个会话 ID。接下来,鲍勃创建垃圾数据,并发送他的公钥、垃圾数据、使用垃圾数据加密的数据包和一个版本协商给爱丽丝。使用鲍勃的公钥,爱丽丝生成共享密钥,并确保鲍勃发送给她的解密数据包已通过垃圾数据验证。最后,爱丽丝发送一个“垃圾终止符”和她自己的垃圾数据加密的数据包,这样鲍勃就可以验证她推导出的正确密钥,并且可以解码她的消息。现在,爱丽丝和鲍勃可以在比特币 P2P 协议上自由交换加密消息。

接口

该库公开了两个核心结构,即 HandshakePacketHandler。握手用于生成一个数据包处理器,并在上述对等体之间执行一个半往返操作。成功的握手将生成一个用于加密和解密通道操作的数据包处理器。

这两个结构都设计为具有裸 no_std 和“无I/O”接口,以使它们尽可能与应用程序运行时无关。

特性标志

  • alloc -- 提供内存分配相关的特性。
  • std -- 包含 alloc 内存分配特性,以及额外的标准库依赖项,用于I/O和随机数生成器。

ChaCha20Poly1305

BIP324选择在内部使用ChaCha20Poly1305认证加密带附加数据(AEAD)算法。这是ChaCha20流加密和Poly1305消息认证码(MAC)的组合。在此上下文中,“认证”指的是加密消息的完整性,而不是通信双方的身份。

Poly1305是一种专用MAC,与像使用SHA256的HMAC这样的现有哈希方案不同,它利用现有的哈希方案来构建消息认证码。专用设计引入了新的复杂性,但也允许提高性能。

ChaCha20和Poly1305都在此crate中实现,以将依赖项保持到最小。

开发

实现通过了BIP324参考向量以及多个额外库测试的测试。

依赖项

~8MB
~98K SLoC