1
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 个单位之间创建共享秘密,但这段代码给了我不同的秘密!有什么想法吗?

4

1 回答 1

0

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

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

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

我们添加的其他密钥协议方案确实需要区分客户端和服务器,例如散列 MQV (HMQV) 和全散列 MQV (FHMQV)ClientServer在 HMQV 和 FHMQV中称为InitiatorResponder 。


我想在 3 个单元之间创建共享密钥,但是这段代码给了我不同的。

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

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

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

于 2016-08-18T02:24:12.213 回答