我的目标是生成RSA 2048位密钥对,以用于访问SSH服务器。
问题在于,从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格式的私钥中找到的模数不同。
任何帮助将不胜感激。
谢谢大家的回答!我发现了问题所在,并想问您有关库实现的意见。 GetModulus()返回“ Integer”类中的模数。很大的数字是使用机器的字节序存储的(在我的情况下为Intel),即使数字是字节序列也是如此。我没有处理字节序,这就是为什么我放入文件中的模数被拒绝的原因。根据我的知识,我没有考虑字节序,它仅适用于CPU字长相同(或更短)的变量。在这种情况下,我们将一个大整数存储为字节序列。任何意见表示赞赏。
最佳问候
/ Alessandro