A continuación, se presenta una implementación
simple del algoritmo RSA del sistema de encriptación asimétrico, recordando su
funcionamiento, este debe generar un par de claves (privada y pública) con las
cuales se realizan el proceso de cifrado y descifrado.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
int e, d, n;
int alg(int a, int b)
{
int q, r1, r2, r;
if (a > b)
{
r1 = a;
r2 = b;
}
else {
r1 = b;
r2 = a;
}
while (r2 > 0)
{
q = r1 / r2;
r = r1 - q * r2;
r1 = r2;
r2 = r;
}
return r1;
}
int prm(int a, int i)
{
int n = i - 1;
int k = 0;
int j, m, T;
while (n % 2 == 0)
{
k++;
n = n / 2;
}
m = n;
T = enc(a, m, i);
if (T == 1 || T == i - 1) {
return 1;
}
for (j = 0; j < k; j++)
{
T = enc(T, 2, i);
if (T == 1) {
return 0;
}
if (T == i - 1) {
return 1;
}
}
return 0;
}
int enc(int a, int m, int n)
{
int r;
int y = 1;
while (m > 0)
{
r = m % 2;
exp(r, n, &y, &a);
m = m / 2;
}
return y;
}
int exp(int bit, int n, int* y, int* a)
{
if (bit == 1) {
*y = (*y * (*a)) % n;
}
*a = (*a) * (*a) % n;
}
int inv(int a, int b)
{
int inv;
int q,r,r1 = a,r2 = b,t,t1 = 0,t2 = 1;
while (r2 > 0)
{
q = r1 / r2;
r = r1 - q * r2;
r1 = r2;
r2 = r;
t = t1 - q * t2;
t1 = t2;
t2 = t;
}
if (r1 == 1) {
inv = t1;
}
if (inv < 0) {
inv = inv + a;
}
return inv;
}
int key()
{
int p, q;
int phi_n;
do {
do
p = rand();
while (p % 2 == 0);
} while (!prm(2, p));
do {
do
q = rand();
while (q % 2 == 0);
} while (!prm(2, q));
n = p * q;
phi_n = (p - 1) * (q - 1);
do
e = rand() % (phi_n - 2) + 2;
while (alg(e, phi_n) != 1);
d = inv(phi_n, e);
}
int Encryption(int value, FILE* out)
{
int cipher;
cipher = enc(value, e, n);
fprintf(out, "%d ", cipher);
}
int Decryption(int value, FILE* out)
{
int decipher;
decipher = enc(value, d, n);
fprintf(out, "%c", decipher);
}
int main(void)
{
FILE *inp, *out;
out = fopen("cipher.txt", "w+");
fclose(out);
out = fopen("decipher.txt", "w+");
fclose(out);
key();
inp = fopen("plain.txt", "r+");
if (inp == NULL)
{
printf("Error opening Source File.\n");
exit(1);
}
out = fopen("cipher.txt", "w+");
if (out == NULL)
{
printf("Error opening Destination File.\n");
exit(1);
}
// comienza el cifrado
while (1)
{
char ch = getc(inp);
if (ch == -1) {
break;
}
int value = toascii(ch);
Encryption(value, out);
}
fclose(inp);
fclose(out);
// comienza el descifrado
inp = fopen("cipher.txt", "r");
if (inp == NULL)
{
printf("Error opening Cipher Text.\n");
exit(1);
}
out = fopen("decipher.txt", "w+");
if (out == NULL)
{
printf("Error opening File.\n");
exit(1);
}
while (1)
{
int cip;
if (fscanf(inp, "%d", &cip) == -1) {
break;
}
Decryption(cip, out);
}
fclose(out);
return 0;
}
No hay comentarios:
Publicar un comentario