2016-12-10 2 views
-6

Я работаю над проектом по реализации алгоритма RSA в C++, и я еще не знаю о C++, но я все еще участвую, Мой вопрос в RSA заключается в том, как кодировать символы с номерами от 0 -25: a кодирование до 0, b до 1, c до 2, . . г до 25,Имплантация алгоритма RSA в C++

вот мой код:

/* 
* C++ Program to Implement the RSA Algorithm 
*/ 
#include<iostream> 
#include<math.h> 
#include<string.h> 
#include<stdlib.h> 

using namespace std; 

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(); 
int prime(long int pr) 
{ 
    int i; 
    j = sqrt(pr); 
    for (i = 2; i <= j; i++) 
    { 
     if (pr % i == 0) 
      return 0; 
    } 
    return 1; 
} 
int main() 
{ 
    cout << "\nENTER FIRST PRIME NUMBER\n"; 
    cin >> p; 
    flag = prime(p); 
    if (flag == 0) 
    { 
     cout << "\nWRONG INPUT\n"; 
     exit(1); 
    } 
    cout << "\nENTER ANOTHER PRIME NUMBER\n"; 
    cin >> q; 
    flag = prime(q); 
    if (flag == 0 || p == q) 
    { 
     cout << "\nWRONG INPUT\n"; 
     exit(1); 
    } 
    cout << "\nENTER MESSAGE\n"; 
    fflush(stdin); 
    cin >> msg; 
    for (i = 0; msg[i] != NULL; i++) 
     m[i] = msg[i]; 
    n = p * q; 
    t = (p - 1) * (q - 1); 
    ce(); 
    cout << "\nPOSSIBLE VALUES OF e AND d ARE\n"; 
    for (i = 0; i < j - 1; i++) 
     cout << e[i] << "\t" << d[i] << "\n"; 
    encrypt(); 
    decrypt(); 
    return 0; 
} 
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; 
    i = 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; 
    cout << "\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; 
    cout << "\nTHE DECRYPTED MESSAGE IS\n"; 
    for (i = 0; m[i] != -1; i++) 
     printf("%c", m[i]); 
} 
+1

И каков ваш вопрос? Пожалуйста, прочитайте [ask]. –

ответ

0

Не уверен, что я получаю свой вопрос прямо, но моя ставка вы спрашиваете, как конвертировать между ASCII и представления числа символов.

Кодировка/Декодирование не имеет отношения к RSA. Вы просто используете динамический сдвиг диапазона. Поскольку алфавит находится в порядке возрастания в ASCII, так что осталось только смещать a или A к нулю.

для строчной полукокса на преобразования номер попытки:

char c='m'; // c is you character m for example 
int i=c-`a`; // i is output number 

если вы получили как строчные и прописные буквы, то вам необходимо изменить его на:

char c='q'; // c is you character q for example 
int i;  // i is output number 
if ((c>='a')&&(c<='z')) i=c-'a'; 
else     i=c-'A';` 

где c ваш характер и i является номер выхода

Для пересчета чисел на символ:

c=i+`a`; 

или прописными буквами:

c=i+`A`;