请检查以下代码..我试图用p和q实现的RSA算法声明为17和11 ...程序在提示用户输入后给出分段错误(核心转储)作为错误纯文本M ......这是什么意思,为什么它会给出这个错误?...任何帮助都会受到赞赏.. :)
#include<iostream>
#include<math.h>
using namespace std;
class RSA
{
public:
long M,phi,d,e,n,c;
int p,q;
RSA();
void calculate();
long relprime();
long gcd(long,long);
void encrypt();
void decrypt();
};
RSA::RSA()
{
cout<<"enter the plain text M";
cin>>M;
p=17;
q=11;
}
void RSA::calculate()
{
n=p*q;
phi=(q-1)*(p-1);
e=(long)relprime();
cout<<e;
d=0;
while(d==0)
{
for(int k=1;;k++)
{
if((phi*k+1)%e==0)
d=(phi*k+1)/e;
}
}
cout<<d;
}
long RSA::relprime()
{
for(int i=2;i<phi;i++)
{
if(gcd(i,phi)==1)
return (long)i;
}
}
long RSA::gcd(long a,long b)
{
if(a<b)
{
if(a%b==0)
return a;
else gcd(b-a,a);
}
else gcd(b,a);
}
void RSA::encrypt()
{
c=(long)pow(M,e);
c=c%n;
cout<<"encrypted c="<<c;
}
void RSA::decrypt()
{
M=(long)pow(c,d);
M=M%n;
cout<<"plain text="<<M;
}
int main()
{
RSA r;
r.calculate();
r.encrypt();
r.decrypt();
return 0;
}
答案 0 :(得分:1)
由于似乎没有任何指针处理,下一个最好的想法可能是堆栈溢出。我注意到你的gcd函数是递归实现的,如果用相同的参数(a == b)调用它,它将永远不会中止递归。也许第if(a<b)
行应该是if(a>=b)
?
编辑:这似乎也不正确......您可能想要检查整个方法:)