CryptoPP::ed25519::Verifier显示与libsignal不同的结果



我正在尝试用CryptoPP实现curve25519验证。我先尝试了libsignal库,它显示了正确的结果。然后我用CryptoPP尝试了相同的数据,但显示了错误的结果。

以下是使用libsignal验证签名的代码:

string pub = str2hex("0504f05568cc7a16fa9b4bc1c9d9294a80b7727e349365f855031a180bf0f80910");
ec_public_key* pub_key;
curve_decode_point(&pub_key, (uint8_t*)pub.data(), pub.size(), 0);
string message = str2hex("05f1fd491d63f1860bdaf3f9b0eb46c2494b7f184a32d9e6c859a421ad284f4307");
string signature = str2hex("5e525df3360ea62281efe8fb9e183521105bb3d9ba8ad43be9fac9d87dd216a6ea9e64099f6f05fbcd6e5a39ab239aad8c1e03d27a1378e4bcbf8937eac4300a");
int ret = curve_verify_signature(
pub_key, 
(uint8_t*)message.data(), message.size(), 
(uint8_t*)signature.data(), signature.size()
);
cout << "ret: " << ret << endl; // shows 1 (correct)

结果为1,表示正确。请注意,libsignal要求pub_key以字节0x05(密钥类型(开头,而不是此处的CryptoPP

使用CryptoPP:的代码

string pub = str2hex("04f05568cc7a16fa9b4bc1c9d9294a80b7727e349365f855031a180bf0f80910");
string message = str2hex("05f1fd491d63f1860bdaf3f9b0eb46c2494b7f184a32d9e6c859a421ad284f4307");
string signature = str2hex("5e525df3360ea62281efe8fb9e183521105bb3d9ba8ad43be9fac9d87dd216a6ea9e64099f6f05fbcd6e5a39ab239aad8c1e03d27a1378e4bcbf8937eac4300a");
ed25519::Verifier verifier((uint8_t*)pub.data());
bool ret = verifier.VerifyMessage(
(uint8_t*)message.data(), message.size(), 
(uint8_t*)signature.data(), signature.size()
);
cout << "ret: " << ret << endl; // shows 0 (wrong)

它显示0,代码出了什么问题?

libsignal在curve25519_verification:上有一个自定义的实现

  • curve25519公钥转换为ed25519公钥(请参阅此处(
  • 验证是使用ed25519签名验证算法完成的(请参阅此处(

如果您尝试使用CryptoPP使用转换后的ed25519公钥验证签名,则验证将失败。这是因为sign和edd25519_verify操作在libsignal中也进行了轻微调整。

最新更新