尝试在带有GMP的C ++上使用RSA从文件中解密,结果无法预测

问题描述

我正在尝试通过GMP库实现RSA算法。当我尝试解密从文件读取的加密值时,最终结果是一个比原始密文大几倍的值。 这是我的代码中有问题的部分:

void cipher_file(mpz_t E,mpz_t N,string Filename){

    // getting the file contents
    // and converting the letters to their ASCII values

    mpz_set_ui(CipheredLetter,TextASCII[j][k]);
    mpz_powm(CipheredLetter,CipheredLetter,E,N);
    // converting the resulting number to a string so that it can
    // be written on a file
    string AuxString(mpz_get_str(NULL,10,CipheredLetter));
    CipheredLine.push_back(AuxString);
}
void decipher_file(mpz_t D,string Filename){

    // getting the file contents

    while(getline(CipheredFile,ReadLine)){
        stringstream Aux(ReadLine); 
        do{
            Aux >> AuxString;
            if(AuxString== "x") // end of line delimeter
                break; 
            
            mpz_set_str(DecipheredLetter,AuxString.c_str(),10);
            mpz_powm(DecipheredLetter,DecipheredLetter,D,N); 
        }while(Aux);
    }
}

加密功能按字母顺序工作,因此,像abc这样的输入将以<ciphered a> <ciphered b> <ciphered b>的形式存储在加密文件中,即ab的最终密码和c之间用空格隔开。 EN是公钥的两个部分,其中N为模,E为(p-1)(q-1),D和{{1 }}是私钥的两个部分。密钥生成按预期工作(使用Fermat的素性测试生成质数P和Q,使用扩展的欧几里得算法生成D I,GMP的基本功能确认我的结果正确)。

问题发生在N行的decipher_file函数中。该行的结果应该是原始文件中字母的ASCII码,但是,结果不是一个很大的看似随机的数字。

这是发生的情况的一个示例(请注意,这些只是64位整数,但这意味着可以做得更好,我只是用64位整数进行测试):

mpz_powm

我发现this的GMP RSA实现简单(有些古老),其功能与我打算的几乎相同,并且与我的操作方式几乎相同,但是,他的工作还不错,由于某些原因,我根本无法理解。

非常感谢您阅读。任何帮助表示赞赏。

解决方法

您的N没有两个不同的主要因素:

4648032597737790824232209858880409 = 68176481265446597^2

这表示您已选择p = q。除了明显的安全性问题(可以通过取平方根很容易分解n)之外,这还会在计算Nreference)的Carmichael totient函数时引起问题。具体来说,lambda(pq) = (p-1)*(q-1)仅对p != q有效。对于p = q,您必须改为使用lambda(p^2) = p(p-1)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...