Crypto ++ RSA密钥大小限制

时间:2019-07-07 23:42:50

标签: c++ encryption cryptography crypto++

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

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

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

提前谢谢!

1 个答案:

答案 0 :(得分: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以在InvalidArgument大于256时抛出bits异常。

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

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

因此您需要在rsa.cpp中修改GenerateRandom

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字节。