如何解决尝试在带有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>
的形式存储在加密文件中,即a
,b
的最终密码和c
之间用空格隔开。
E
和N
是公钥的两个部分,其中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
)之外,这还会在计算N
(reference)的Carmichael totient函数时引起问题。具体来说,lambda(pq) = (p-1)*(q-1)
仅对p != q
有效。对于p = q
,您必须改为使用lambda(p^2) = p(p-1)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。