【发布时间】: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++