2012-02-23 34 views
1

請檢查以下代碼..我試圖用p和q聲明爲17和11的RSA算法...程序給出了段錯誤(核心轉儲)爲將提示用戶輸入明文M,後錯誤......這是什麼意思,爲什麼它給這個錯誤?? ...任何幫助,將不勝感激.. :)我的RSA算法程序中的分段錯誤

#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

「賽格故障」是指您要訪問的是你沒有自己的記憶。您應該在調試器中運行您的程序以查找哪條線路導致問題,然後從那裏開始。 – 2012-02-23 13:40:04

+0

發現cin >> M在構造函數中導致問題......所以聲明M爲某個值,但仍然是相同的seg-fault錯誤..我不認爲我正在訪問任何我不擁有的內存.. – 2012-02-23 13:55:52

回答

1

由於不似乎是任何指針處理,下一個最好的想法可能是堆棧溢出。我注意到你的gcd函數是遞歸實現的,如果它曾經被相同的參數調用(a == b),它將永遠不會中止遞歸。也許線if(a<b)應該是if(a>=b)而不是?

編輯:這看起來不正確要麼...你可能要檢查的方法作爲一個整體:)