2015-12-21 6 views
-2

Я пытаюсь настроить этот код на шифрование и дешифрование с помощью RSA-канала на языке C, но я просто не могу заставить его работать. Он запрашивает два простых числа, а также сообщение, но не отображает ни зашифрованный, ни расшифрованный текст.RSA Код шифрования в C требуется

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 

long int p,q,n,t,flag,e[100],d[100],temp[100],j,m[100],en[100],i; 
char msg[100]; 
int prime(long int); 
void ce(); 
long int cd(long int); 
void encrypt(); 
void decrypt(); 
void main() 
{ 

    printf("\nENTER FIRST PRIME NUMBER\n"); 
    scanf_s("%d",&p); 
    flag=prime(p); 
    if(flag==0) 
    { 
     printf("\nWRONG INPUT\n"); 
     getch(); 
     exit(1); 
    } 
    printf("\nENTER ANOTHER PRIME NUMBER\n"); 
    scanf_s("%d",&q); 
    flag=prime(q); 
    if(flag==0||p==q) 
    { 
     printf("\nWRONG INPUT\n"); 
     getch(); 
     exit(1); 
    } 
    printf("\nENTER MESSAGE\n"); 
    fflush(stdin); 
    scanf_s("%s",msg); 
    for(i=0;msg[i]!=NULL;i++) 
     m[i]=msg[i]; 
    n=p*q; 
    t=(p-1)*(q-1); 
    ce(); 
    printf("\nPOSSIBLE VALUES OF e AND d ARE\n"); 
    for(i=0;i<j-1;i++) 
     printf("\n%ld\t%ld",e[i],d[i]); 
    encrypt(); 
    decrypt(); 
    getch(); 
} 
int prime(long int pr) 
{ 
    int i; 
    j=sqrt((double)pr); 
    for(i=2;i<=j;i++) 
    { 
     if(pr%i==0) 
      return 0; 
    } 
    return 1; 
} 
void ce() 
{ 
    int k; 
    k=0; 
    for(i=2;i<t;i++) 
    { 
     if(t%i==0) 
      continue; 
     flag=prime(i); 
     if(flag==1&&i!=p&&i!=q) 
     { 
      e[k]=i; 
      flag=cd(e[k]); 
      if(flag>0) 
      { 
       d[k]=flag; 
       k++; 
      } 
      if(k==99) 
       break; 
     } 
    } 
} 
long int cd(long int x) 
{ 
    long int k=1; 
    while(1) 
    { 
     k=k+t; 
     if(k%x==0) 
      return(k/x); 
    } 
} 
void encrypt() 
{ 
    long int pt,ct,key=e[0],k,len; 
    =0; 
    len=strlen(msg); 
    while(i!=len) 
    { 
     pt=m[i]; 
     pt=pt-96; 
     k=1; 
     for(j=0;j<key;j++) 
     { 
      k=k*pt; 
      k=k%n; 
     } 
     temp[i]=k; 
     ct=k+96; 
     en[i]=ct; 
     i++; 
    } 
    en[i]=-1; 
    printf("\nTHE ENCRYPTED MESSAGE IS\n"); 
    for(i=0;en[i]!=-1;i++) 
     printf("%c",en[i]); 
} 
void decrypt() 
{ 
    long int pt,ct,key=d[0],k; 
    i=0; 
    while(en[i]!=-1) 
    { 
     ct=temp[i]; 
     k=1; 
     for(j=0;j<key;j++) 
     { 
      k=k*ct; 
      k=k%n; 
     } 
     pt=k+96; 
     m[i]=pt; 
     i++; 
    } 
    m[i]=-1; 
    printf("\nTHE DECRYPTED MESSAGE IS\n"); 
    for(i=0;m[i]!=-1;i++) 
     printf("%c",m[i]); 
} 
+5

секретный для читаемого кода .. PROPER INDENTATION .. – Haris

+0

На самом деле я не вижу никаких оправданий, чтобы не отступать от кода, а сегодня, возможно, только Блокнот не поддерживает автоотчет .. –

+0

Какова цель ' = 0; 'в верхней части функции' encrypt() '? –

ответ

1

Этот вызов

scanf_s("%s",msg); 

отсутствует аргумент размера. Изменение в

scanf_s("%s", msg, (unsigned)sizeof msg); 

Вы также делаете это

for(i=0;msg[i]!=NULL;i++) 
    m[i]=msg[i]; 

, который генерирует предупреждение компилятора, поскольку NULL это значение указателя, а не символьное значение. Но его самый большой грех - это не копирование терминатора строк '\0'. Что делать против strcpy() или даже strdup()?

Смежные вопросы