【问题标题】:CryptoPP generates invalid keys RSACryptoPP 生成无效密钥 RSA
【发布时间】:2021-02-13 17:06:12
【问题描述】:

我正在尝试用 C++ 中的 RSA 加密一些文本,

加密时我生成n, e, d,但尝试解密时,私钥初始化程序说密钥无效...

所以我构建了一个生成密钥的代码,然后尝试在此之后立即初始化一个私钥对象,它说密钥仍然无效:

int main()
{
    
    CryptoPP::InvertibleRSAFunction params;
    CryptoPP::AutoSeededRandomPool prng;
    params.GenerateRandomWithKeySize(prng, 2048);
    params.SetPublicExponent(65537);

    const CryptoPP::Integer& n = params.GetModulus();
    const CryptoPP::Integer& p = params.GetPrime1();
    const CryptoPP::Integer& q = params.GetPrime2();
    const CryptoPP::Integer& d = params.GetPrivateExponent();
    const CryptoPP::Integer& e = params.GetPublicExponent();

    CryptoPP::RSA::PrivateKey privk;
    privk.Initialize(n, e, d);
}

程序崩溃到:InvertibleRSAFunction: input is not a valid RSA private key

【问题讨论】:

  • GenerateRandomWithKeySize() 不能用于生成公共指数为 65537 的密钥,而只能生成 17。如果公共指数之后更改,则会触发发布的错误消息,如果之前更改,忽略此更改,并生成公共指数为 17 的密钥。要生成具有用户定义大小和公共指数的密钥,必须使用不同的重载,即privk.Initialize(prng, 2048, 65537);
  • @Topaco 这是一个答案,而不是评论。此外,Initialize 必须返回异常,因为 65537 与 Euler toitent(或 lambda)可能不是相对质数。
  • 许多库现在默认使用一个公共指数,即费马的第五个素数、F4 或 65537(十六进制的010001 显示了该值的原因)。但是,CryptoPP 是一个较旧的库;他们可能一直保持旧的默认值。
  • @kelalaka 这对我来说没有多大意义;显然,公共指数是预先设置的,即使它是 17。大多数 RSA 密钥对生成是使用 F4 集执行的,并且给定的答案也假设了这一点。无论如何,您始终可以在密钥对生成期间重试; RSA 已经有一个不确定的运行时间。

标签: c++ cryptography rsa crypto++


【解决方案1】:

您的问题是您在生成密钥后修改了指数。

params.GenerateRandomWithKeySize(prng, 2048);
params.SetPublicExponent(65537);

实际上key是在第一行生成的,e = 17。尝试改变行序。

params.SetPublicExponent(65537);
params.GenerateRandomWithKeySize(prng, 2048);

【讨论】: