Ошибка сегментации в моей программе алгоритма RSA - PullRequest
1 голос
/ 23 февраля 2012

пожалуйста, проверьте следующий код ... свой алгоритм RSA, который я пытаюсь реализовать, используя p и q, объявленные как 17 и 11 ... программа выдает ошибку сегментации (сбрасывается ядро) как ошибку после запроса ввода пользователем простой текст М ... что это значит и почему он дает эту ошибку ?? ... любая помощь будет оценена ..:)

#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;         
}         

1 Ответ

1 голос
/ 23 февраля 2012

Поскольку обработка указателей, по-видимому, не выполняется, следующей лучшей идеей может быть переполнение стека.Я заметил, что ваша функция gcd реализована рекурсивно и никогда не прервет рекурсию, если она когда-либо вызывается с одинаковыми параметрами (a == b).Возможно, строка if(a<b) должна быть вместо if(a>=b)?

Редактировать: Это тоже не кажется правильным ... Вы можете проверить этот метод в целом:)

...