关于serde-encrypt中密钥交换及公私钥序列化的技术问询
serde-encrypt测试用例中的密钥交换及相关问题解答
一、密钥交换执行流程
示例中的密钥交换基于**ECDH(椭圆曲线迪菲-赫尔曼)**算法,具体步骤:
- 双方生成专属密钥对:Alice生成
ReceiverKeyPair,Bob生成SenderKeyPair(本质均为ECDH密钥对,库中做了角色区分) - 交换公钥:Bob将自身公钥传递给Alice,Alice将自身公钥传递给Bob
- 生成组合密钥:
- Alice用Bob的公钥 + 自身私钥,创建
ReceiverCombinedKey - Bob用自身私钥 + Alice的公钥,创建
SenderCombinedKey
- Alice用Bob的公钥 + 自身私钥,创建
- 共享密钥传递:
- Bob生成对称加密用的共享密钥
bob_shared_key - Bob通过
SenderCombinedKey加密共享密钥,得到encrypted_shared_key - Alice用
ReceiverCombinedKey解密encrypted_shared_key,得到与Bob一致的共享密钥
- Bob生成对称加密用的共享密钥
- 后续通过该共享密钥完成对称加密的消息传输
二、公/私钥的序列化与反序列化
serde-encrypt的所有密钥类型(SenderPublicKey/ReceiverPublicKey/SenderPrivateKey/ReceiverPrivateKey)均实现了serde的序列化/反序列化 trait,同时支持字符串格式转换:
- 序列化到字符串:直接用
serde_json::to_string()序列化密钥对象,或调用密钥类型的to_string()方法(底层基于base64编码) - 从字符串反序列化:用
serde_json::from_str()解析,或调用密钥类型的from_string()静态方法完成解码
示例未展示这部分是因为测试用例在本地完成密钥交换,无需跨网络传输,因此省略了序列化步骤。实际场景中,可将公钥序列化为字符串发送给对方,对方再反序列化为密钥对象。
三、从String构建SenderPublicKey的方法
有两种常用方式:
- 基于serde反序列化:
use serde_json; use serde_encrypt::key_exchange::SenderPublicKey; let pub_key_str = "..."; // 从网络或存储获取的公钥字符串 let pub_key: SenderPublicKey = serde_json::from_str(pub_key_str)?;
- 使用库提供的
from_string方法:
use serde_encrypt::key_exchange::SenderPublicKey; let pub_key_str = "..."; let pub_key = SenderPublicKey::from_string(pub_key_str)?;
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

