【问题标题】:Crypto++ RSA key size limitationCrypto++ RSA 密钥大小限制
【发布时间】:2019-07-07 23:42:50
【问题描述】:

我想将 Crypto++ 中使用的密钥大小限制为 256 位。我在代码中找到的唯一包含关键字key的是变量aKeySize,以此类推,我发现它是摘要的字符数。

这是我复制我的程序a link的地方。

如何为 RSA 对密钥定义 256 位的限制?

提前谢谢你!

【问题讨论】:

  • 问题是什么?
  • 如何定义 cruptopp 中使用的密钥大小(私钥和公钥)
  • 您想通过将 RSA 密钥对长度减少到仅 256 位来解决什么问题? 256 位 RSA 密钥对的安全性如此之高,以至于在某些实现中甚至没有“允许”。
  • 我也许可以对我的 MSX-2 计算机进行编程,以便破解 256 位 RSA。我的意思是更新的 Lenstra 方程需要 427 位的密钥大小才能在 1984 年之前一直保持安全(大约是我父母为我和我兄弟购买第一台计算机的时间):P

标签: c++ encryption cryptography crypto++


【解决方案1】:

如何为 RSA 对密钥定义 256 位的限制?

来自link中的测试程序:

int main(int, char **) {
  auto keys = RsaGenerateHexKeyPair(3072);
  std::cout << "Private key: " << std::endl << keys.privateKey << "\n" << std::endl;

  std::cout << "Public key: " << std::endl << keys.publicKey << "\n" << std::endl;
  ...
}

您应该将RsaGenerateHexKeyPair(3072) 更改为:

auto keys = RsaGenerateHexKeyPair(256);

如果要在 Crypto++ 库中更改它,则修改 GenerateRandom 以在 bits 大于 256 时抛出 InvalidArgument 异常。

GenerateRandomWithKeySize 是 Crypto++ 深处的基类的一部分。它在cryptlib.cpp中实现,它的主体是:

void GeneratableCryptoMaterial::GenerateRandomWithKeySize(RandomNumberGenerator &rng, unsigned int keySize)
{
    GenerateRandom(rng, MakeParameters("KeySize", (int)keySize));
}

所以你需要修改GenerateRandom中的rsa.cpp

void InvertibleRSAFunction::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg)
{
    int modulusSize = 2048;
    alg.GetIntValue(Name::ModulusSize(), modulusSize) || alg.GetIntValue(Name::KeySize(), modulusSize);

    CRYPTOPP_ASSERT(modulusSize >= 16);
    if (modulusSize < 16)
        throw InvalidArgument("InvertibleRSAFunction: specified modulus size is too small");

    m_e = alg.GetValueWithDefault(Name::PublicExponent(), Integer(17));

    CRYPTOPP_ASSERT(m_e >= 3); CRYPTOPP_ASSERT(!m_e.IsEven());
    if (m_e < 3 || m_e.IsEven())
        throw InvalidArgument("InvertibleRSAFunction: invalid public exponent");

    RSAPrimeSelector selector(m_e);
    AlgorithmParameters primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize)
        (Name::PointerToPrimeSelector(), selector.GetSelectorPointer());
    m_p.GenerateRandom(rng, primeParam);
    m_q.GenerateRandom(rng, primeParam);

    m_d = m_e.InverseMod(LCM(m_p-1, m_q-1));
    CRYPTOPP_ASSERT(m_d.IsPositive());

    m_dp = m_d % (m_p-1);
    m_dq = m_d % (m_q-1);
    m_n = m_p * m_q;
    m_u = m_q.InverseMod(m_p);   
}

但钥匙还是那么大......(来自之前的评论)

256 位 RSA 通常被认为太小。普通人触手可及。

您应该考虑改用椭圆曲线。如果您修复曲线并使用压缩的公共点,那么您可以获得一个相当小的密钥,例如 secp256 的 32 字节数量级。

【讨论】:

  • 谢谢@jww 我已经尝试过了,但我仍然感到困惑,因为最后生成的私钥长度为 369,这意味着 369* 4 位
  • 另见 Crypto++ wiki 上的 Keys and Formats | RSA Private key。一个 RSA 私钥编码了 11 个字段。
  • CryptoPP 是一个纯软件实现 afaik。任何人仍然可以通过自己生成密钥对来解决非常愚蠢的限制。这个问题毫无意义。提议的解决方案可能是正确的,但如果问题没有指出为什么这个问题很愚蠢以及为什么限制没有意义,我不能同意。
  • @Maarten - 是的,这些是一些不寻常的要求。我认为 OP 需要 (1) 块密码或流密码,或 (2) 短签名方案,但我们没有足够的信息来提出不同的建议。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多