Caso práctico de aplicación (qué algoritmo, dónde y cómo usarlo).

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

Preguntas Orientadoras

  ¿Qué son las claves públicas y privadas? En el contexto del cifrado asimétrico o cripto sistemas de clave publica, teniendo en cuenta que ...