在 Crypto++ 中解析 GFP2Element

Parsing the GFP2Element in Crypto++

我正在尝试使用 DH 示例在该站点中生成 AES 密钥 https://www.cryptopp.com/wiki/Diffie-Hellman

但我正在用 XTR-DH 更改它,我想打印出发电机编号,但它无法显示,因为 .GetSubgroupGenerator() 使用 GFP2Element class

这是代码

int main()
{
    AutoSeededRandomPool aSRP;
    XTR_DH xtr(aSRP, 251, 224);
    SecByteBlock priv(xtr.PrivateKeyLength());
    SecByteBlock publ(xtr.PublicKeyLength());
    SecByteBlock secretKey(xtr.AgreedValueLength());
    xtr.GenerateKeyPair(aSRP, priv, publ);

    cout << "Prime: " << xtr.GetModulus() << endl;
    cout << "Generator" << xtr.GetSubgroupGenerator() << endl;
    system("pause");
    return 0;
}

那么,解决办法是什么?谢谢

GFP2Element 没有重载的提取运算符。您只需打印 c1c2 类型的 Integer 成员。 (这与椭圆曲线字段元素的策略相同)。

$ cat test.cxx
#include "cryptlib.h"
#include "osrng.h"
#include "xtrcrypt.h"

#include <iostream>

int main()
{
    using namespace CryptoPP;

    AutoSeededRandomPool aSRP;
    XTR_DH xtr(aSRP, 251, 224);

    std::cout << "Prime: " << std::hex << xtr.GetModulus() << std::endl;
    std::cout << "Generator" << std::endl;
    std::cout << "  c1: " << std::hex << xtr.GetSubgroupGenerator().c1 << std::endl;
    std::cout << "  c2: " << std::hex << xtr.GetSubgroupGenerator().c2 << std::endl;

    return 0;
}

并且:

$ g++ -DNDEBUG -g2 -O3 -fPIC -pthread test.cxx ./libcryptopp.a -o test.exe
$ ./test.exe
Prime: 607cd5cbdfa7ac6ed4fecaa83458fb7d9675a32f002a54380f22fd54d1b9c67h
Generator
  c1: 420c85a614a6f0426e6655a44fe6e1ea00ed27fbf1adbe23f4ad358ad837c9ah
  c2: 2ef44b40639a34fb0b4f9a5aab1d89bd0eca5c19c160e007daf1dd2bbe730eeh

另见 XTR-DH on the Crypto++ wiki and the xtr.h 头文件。


关于:

XTR_DH xtr(aSRP, 251, 224);

pbits=251qbits=224 有点不匹配。对于 80 位的安全性,建议您使用 pbits=170qbits=160。这大致相当于一个 1024 位 RSA 模数。

对于 112 位安全,建议您使用 pbits=341qbits=224-256。这大致相当于 2048 位 RSA 模数。

对于 128 位的安全性,建议您使用 pbits=512qbits=256。这大致相当于 3072 位 RSA 模数。

另请参阅 Crypto++ wiki 上的 Security Level