ECDH 共享密钥在循环中与 Crypto++ 不匹配

ECDH shared secret doesn't match in loop, with Crypto++

CryptoPP::OID CURVE = CryptoPP::ASN1::secp256r1();
CryptoPP::AutoSeededRandomPool prng;
std::vector<kpStruct> KPVecRSU;

(loop begin)
kpStruct keyP;
CryptoPP::ECDH < CryptoPP::ECP >::Domain dhA( CURVE );
CryptoPP::SecByteBlock privA(dhA.PrivateKeyLength()), pubA(dhA.PublicKeyLength());
dhA.GenerateKeyPair(prng, privA, pubA);
CryptoPP::SecByteBlock sharedA(dhA.AgreedValueLength());
keyP.sharedECDH = sharedA;
KPVecRSU.push_back(keyP);
(loop end)

我想在 3 个单元之间创建共享密钥,但这段代码给我的是不同的!有什么想法吗?

ECDH shared secret doesn't match in loop, with Crypto++

协议的每个 运行 都会产生一个不同的共享秘密,因为客户端和服务器都在密钥协商期间提供随机值。继承随机性提供了前向保密性,这意味着坏人无法在以后的某个时间点恢复纯文本,因为随机值是临时的或短暂的(在协议执行后被遗忘)。

在 Crypto++ 实现中,库甚至不区分客户端和服务器,因为协议中存在太多对称性。过于对称的协议可能会遭受国际象棋大师攻击,其中一个协议执行用于解决另一个协议执行(把它想象成一个中间人,坏人是两个大师的代理)大师)。通常,您会在一侧或另一侧调整参数以打破对称性(客户端使用 14 字节随机数,服务器使用 18 字节随机数)。

我们正在添加的其他密钥协议方案需要区分客户端和服务器,如Hashed MQV (HMQV) and Fully Hashed MQV (FHMQV)ClientServer在HMQV中被称为InitiatorResponder和 FHMQV。


I want to create shared secret between 3 units, but this code give me different ones.

这是一个不同的问题。这被称为 Group Diffie-Hellman 或 Multi-party Diffie-Hellman。例如,它在受保护内容的聊天和广播中有应用,其中用户是组的一部分或加入组。问题的棘手部分是当用户离开组或不再被授权时如何撤销对组的访问。

据我所知,Crypto++ 不提供任何组 DH 方案。您也许可以修改现有来源来执行此操作。

对于 Diffie-Hellman,您需要搜索Google Scholar for the papers。特别注意方案的安全属性,例如如何加入和离开组(授予和撤销访问权限)。