C++ 加密++;RSA密钥大小限制

C++ 加密++;RSA密钥大小限制,c++,encryption,cryptography,crypto++,C++,Encryption,Cryptography,Crypto++,我想将Crypto++中使用的密钥大小限制为256位。我在包含关键字键的代码中发现的唯一一件事是变量aKeySize,通过类比,我发现它是摘要的字符数 这就是我复制程序的地方 如何为RSA密钥对定义256位的限制 提前谢谢你 如何为RSA密钥对定义256位的限制 从中的测试程序: 如果要在Crypto++库中对其进行更改,请修改生成器域,以在位大于256时引发无效参数异常 GenerateRandomWithKeySize是Crypto++内部的基类的一部分。它在中实施,其主体是: void

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

这就是我复制程序的地方

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

提前谢谢你

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

从中的测试程序:


如果要在Crypto++库中对其进行更改,请修改
生成器域
,以在
大于256时引发
无效参数
异常

GenerateRandomWithKeySize
是Crypto++内部的基类的一部分。它在中实施,其主体是:

void GeneratableCryptoMaterial::GenerateRandomWithKeySize(RandomNumberGenerator &rng, unsigned int keySize)
{
    GenerateRandom(rng, MakeParameters("KeySize", (int)keySize));
}
因此,您需要在以下位置修改
generateradom

void InvertibleRSAFunction::generateradom(RandomNumberGenerator&rng、const NameValuePairs&alg)
{
int moduleusSize=2048;
alg.GetIntValue(名称::ModulusSize(),ModulusSize)| | alg.GetIntValue(名称::KeySize(),ModulusSize);
CRYPTOPP_断言(modulusSize>=16);
if(模块化小于16)
抛出无效参数(“可逆安全函数:指定的模数大小太小”);
m_e=alg.GetValueWithDefault(Name::PublicExponent(),整数(17));
CRYPTOPP_ASSERT(m_e>=3);CRYPTOPP_ASSERT(!m_e.IsEven());
if(m|e<3 | m|e.IsEven())
抛出InvalidArgument(“InversiblerSAFunction:无效的公共指数”);
选择开关(m_e);
AlgorithmParameters primeParam=MakeParametersForTwoPrimesOfEqualSize(ModulesSize)
(名称::PointerToPrimeSelector(),selector.GetSelectorPointer());
m_p.generateradom(rng,primeParam);
m_q.generateradom(rng,primeParam);
m_d=m_e.InverseMod(LCM(m_p-1,m_q-1));
CRYPTOPP_断言(m_d.IsPositive());
m_dp=m_d%(m_p-1);
m_dq=m_d%(m_q-1);
m_n=m_p*m_q;
m_=m_q.逆模(m_p);
}

但是钥匙还是那么大。。。(摘自早些时候的评论)

256位RSA通常被认为太小。普通人很容易接触到它


你应该考虑切换到椭圆曲线。如果修正曲线并使用压缩的公共点,则可以获得相当小的密钥,如secp256的32字节左右。

问题是什么?如何定义cruptopp(私钥和公钥)中使用的密钥大小?将RSA密钥对长度减少到256位,您试图解决什么问题?256位RSA密钥对的安全性非常低,在某些实现中甚至是“不允许”的。我可能可以对我的MSX-2计算机进行编程,以破解256位RSA。我的意思是,更新后的Lenstra方程需要427位的密钥才能确保安全,直到1984年(大约是我父母为我和我兄弟购买第一台计算机的时候):Pthank you@jww我已经尝试过了,但我仍然感到困惑,因为最后生成的私钥长度为369,这意味着369*4位也可以在Crypto++wiki上看到。RSA私钥中有11个字段编码。CryptoPP是afaik的一种纯软件实现。任何人都可以通过自己生成密钥对来绕过这个极其愚蠢的限制。这个问题毫无意义。提议的解决方案可能是正确的,但如果没有问题指出为什么这个问题愚蠢,为什么限制没有意义,我就不能同意。@Maarten-是的,这些是一些不寻常的要求。我认为OP需要(1)块密码或流密码,或者(2)一个短签名方案,但我们没有足够的信息来提出不同的建议。
auto keys = RsaGenerateHexKeyPair(256);
void GeneratableCryptoMaterial::GenerateRandomWithKeySize(RandomNumberGenerator &rng, unsigned int keySize)
{
    GenerateRandom(rng, MakeParameters("KeySize", (int)keySize));
}
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);   
}