Реализация RSA в C - PullRequest
       18

Реализация RSA в C

0 голосов
/ 21 января 2019

Я пытаюсь реализовать алгоритм RSA в C для проекта.

Я могу сгенерировать нужные ключи шифрования / дешифрования, но не могу правильно выполнить шифрование / дешифрование. Ошибка, кажется, заключается в том, как я вычисляю зашифрованное сообщение. Математика для него: m ^ e mod n, где m - сообщение, e - показатель шифрования, а n - модуль для открытого ключа и закрытых ключей. Я вычисляю m ^ e, используя функцию pow (), и вычисляю mod n, используя как функцию fmod (), так и как% n. ни то, ни другое не работает (дайте правильный вывод).

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

int p1,p2,mod,tot, encExp, decExp, conRelVal;
// Function to check if numbers given are primes
// @param pr: the number being tested
int prime(long int pr){
  int i;
  int j;
  j = sqrt(pr);
  for(i = 2; i <= j; i++){
   if(pr % i == 0)
     return 0;
  }
  return 1;
}

int gcd(int a, int h) 
{ 
    int temp; 
    while (1) 
    { 
        temp = a%h; 
        if (temp == 0) 
          return h; 
        a = h; 
        h = temp; 
    } 
} 

//function to generate encryption key
void encryption_key(){
  p1 = 61;
  p2 = 53;
  conRelVal = 15;
  mod = p1*p2;
  tot = (p1-1)*(p2-1);
  encExp = 12;
  while (encExp < tot){ 
        // e must be co-prime to the totient and 
        // smaller than the totient. 
        if (gcd(encExp,tot)==1) 
            break; 
        else
            encExp++; 
  } 

  decExp = ((1+(conRelVal*tot))/encExp);

printf("p1=%d\np2=%d\nmod=%d\ntot=%d\ne=%d\nd=%d\nconst=%d\n",p1,p2,mod,tot, encExp, decExp, conRelVal);
  printf("Public Key:\t(%d,%d)", mod,encExp);
  printf("\nPrivate Key:\t(%d,%d)", mod,decExp);
}

double encrypt(int msg){
  // Encryption c = (msg ^ e) % n 
  double l;
  l = pow(msg, encExp);
  int j;
  j = ((int)l%mod);
  l = fmod(l, mod);
  printf("\nMessage:\t%d\nEncrypted:\t%lf",msg,l);
  printf("\nMessage:\t%d\nEncrypted:\t%d",msg,j);
  return l;
}

void decrypt(double cyp){
  // Decryption m = (c ^ d) % n 
  double m ;
  m = pow(cyp, decExp);
  int z = ((int)m%mod);     
  m = fmod(m, mod); 
  printf("\nEncrypted:\t%lf\nDecrypted:\t%lf",cyp,m);
  printf("\nEncrypted:\t%lf\nDecrypted:\t%d",cyp,z);
}

int main() { 
  encryption_key();
  int msg = 123;
  double cyp = encrypt(msg);
  decrypt(cyp);
  return 0;
}

Results:  

  $ ./test
p1=61
p2=53
mod=3233
tot=3120
e=17
d=2753
const=15
Public Key:     (3233,17)
Private Key:    (3233,2753)
Message:        123
Encrypted:      992.000000
Message:        123
Encrypted:      -2194
Encrypted:      992.000000
Decrypted:      nan
Encrypted:      992.000000
Decrypted:      -2194

Я ожидаю, что Encrypted будет 855 и расшифровывается как 123

1 Ответ

0 голосов
/ 21 января 2019

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

мне немного сложно объяснить это здесь. Короче говоря, я пытаюсь сказать, что ваши расчеты могут оказаться неожиданно неверными, поскольку переменные обладают емкостью, на которой можно хранить большое значение. поэтому убедитесь, что нет переполнений и расчеты верны. если вычисления окажутся неверными, то ваш вывод будет явно неверным.

...