【问题标题】:Crypto++ GetModulus() issueCrypto++ GetModulus() 问题
【发布时间】:2019-11-22 16:07:29
【问题描述】:

我的目标是生成用于访问 SSH 服务器的 RSA 2048 位密钥对。

问题是从GetModulus() 得到的模数不是真正的键的模数。如果我以 DER 格式导出密钥,则模数字段的内容与 GetModulus() 函数结果不同。

下面是我生成密钥对的代码:

// Generate keys pair
AutoSeededRandomPool lRnd;
InvertibleRSAFunction lPrms;
lPrms.GenerateRandomWithKeySize(lRnd, 2048);
RSA::PrivateKey lPrvKey(lPrms);
RSA::PublicKey lPubKey(lPrms);

// Convert private key to DER base64
Base64Encoder lB64PrvEncoder;
AlgorithmParameters lPrvPrms = MakeParameters(Name::MaxLineLength (), 64);
lB64PrvEncoder.IsolatedInitialize(lPrvPrms);
lPrvKey.DEREncodePrivateKey(lB64PrvEncoder);
lB64PrvEncoder.MessageEnd();

// Convert public key to base64 openSSH format
Integer lN = lPubKey.GetModulus();
Integer lE = lPubKey.GetPublicExponent();
QByteArray lSSHPubKey;
PubKeyToSSHFormat(lE, lN, lSSHPubKey);

如上,lN 与 DER 格式私钥中的模数不同。

任何帮助将不胜感激。

【问题讨论】:

  • 我不清楚键或模数有什么不同。我认为您应该使用 256 位或 512 位密钥并提供更多信息。显示GetModulus() 中的Integer,然后使用Peter Gutmann 的dumpasn1 显示DER 编码的密钥。 std::cout << std::hex << 1N << std::endl; 应该以十六进制打印模数。 dumpasn1 将以十六进制显示字段。
  • @jww 我经常只是将 base 64 编码的 DER 粘贴到 here (lapo.it) 中,或者我使用 openssl asn1parse,它也接受 -dump 选项...可能更容易访问,虽然我猜测 Alessandro 能够编译 C 代码 :)

标签: c++ cryptography rsa crypto++


【解决方案1】:

谢谢大家的回答!我发现了问题所在,我想请教您对库实现的看法。 GetModulus() 返回“整数”类中的模数。这个大数字是使用机器的字节序存储的(在我的例子中是英特尔),即使这个数字是一个字节序列。我没有管理字节序,这就是我放入文件中的模数被拒绝的原因。我没有考虑字节序,根据我的知识,它仅适用于与 CPU 字长相同(或更短)的变量。 在这种情况下,我们将一个大整数存储为字节序列。任何意见表示赞赏。

最好的问候

/亚历山德罗

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多