typedef unsigned long num;
typedef struct t_rsa_pubkey t_rsa_pubkey;
struct t_rsa_pubkey {
num e;
num n;
};
typedef struct t_rsa_privkey t_rsa_privkey;
struct t_rsa_privkey {
num d;
num n;
};
/* Verifica si el parametro es un numero primo */
int is_prime (num pr) {
num i;
if (pr==1) return 1;
for (i=3; i<pr; i+=2)
if ((pr%i != 0) && (i*i <= pr)) break;
if (i*i > pr) return 1;
else return 0;
}
/* (a^b) mod n */
static num modexp (num a, num b, num n) {
num y;
y = 1;
while (b!=0) {
if (b & 1) y = (y * a) % n;
a = (a * a) % n;
b = b >> 1;
}
return y;
}
/* Cifra plaintext */
void rsa_cipher (num plaintext, num *ciphertext, t_rsa_pubkey pubkey) {
*ciphertext = modexp (plaintext, pubkey.e, pubkey.n);
}
/* Descifra ciphertext */
void rsa_decipher (num ciphertext, num *plaintext, t_rsa_privkey privkey) {
*plaintext = modexp (ciphertext, privkey.d, privkey.n);
}
/* Genera un clave publica y una privada a partir de p y q. */
void rsa_genkeys (num p, num q, t_rsa_pubkey *pubkey, t_rsa_privkey *privkey) {
num n, fi, i, e, d;
/* Calculamos n */
n = p * q;
/* Calculamos fi */
fi = (p-1) * (q-1);
/* Calculamos e */
for (i=1; i<fi; i++) if (is_prime(i)) { if (fi%i!=0) { e=i; break; } }
/* Calculamos d */
for (i=1; i<fi; i++) if ( ((i*fi)+1)%e == 0) { d=((i*fi)+1)/e; break; }
pubkey->e = e;
pubkey->n = n;
privkey->d = d;
privkey->n = n;
}
int main (int argc, char **argv)
{
num num_plain;
num num_cipher;
t_rsa_pubkey pubkey;
t_rsa_privkey privkey;
num p, q;
if (argc != 4) {
printf ("Uso: %s |
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/engine.h>
int main()
{
RSA *keypair;
char *cleartext = "Hola caracola";
char *ciphertext;
char *cleartext2;
keypair = RSA_new();
/* Generamos un par de claves de 1024 bits */
keypair = RSA_generate_key (1024, 17, NULL, NULL);
ciphertext = malloc(RSA_size(keypair));
RSA_public_encrypt (strlen(cleartext)+1, cleartext, ciphertext, keypair,
RSA_PKCS1_PADDING);
cleartext2 = malloc(RSA_size(keypair));
RSA_private_decrypt (RSA_size(keypair), ciphertext, cleartext2, keypair,
RSA_PKCS1_PADDING);
printf("%s\n", cleartext2);
RSA_free(keypair);
return 0;
}
|
#include <gmp.h>
int main (int argc, char **argv) {
mpz_t n;
mpz_t d;
mpz_t q;
mpz_t r;
if (argc!=2) {
printf ("%s <numero>\n", argv[0]);
return 0;
}
mpz_init (n);
mpz_init (d);
mpz_init (q);
mpz_init (r);
/* Inicializamos valores */
mpz_set_ui (d, 2);
mpz_set_str (n, argv[1], 10);
while (1) {
/* Si n=1 salir */
if (mpz_cmp_ui (n, 1)==0) return 0;
/* q=n/d, r=n mod d */
mpz_cdiv_qr (q, r, n, d);
if (mpz_probab_prime_p (d, 5)>0) {
/* Si r=0 */
if (mpz_cmp_ui (r, 0)==0) {
gmp_printf ("factor: %Zd\n", d);
mpz_set (n, q);
}
else {
/* Si q > d, d++ */
if (mpz_cmp (q,d) > 0) mpz_add_ui (d, d, 1);
else {
gmp_printf ("factor: %Zd\n", n);
break;
}
}
}
else mpz_add_ui (d, d, 1);
}
mpz_clear (n);
mpz_clear (d);
mpz_clear (q);
mpz_clear (r);
return 0;
}
|
#include <gmp.h>
int main (int argc, char **argv) {
int cmp;
mpz_t n;
mpz_t p;
mpz_t q;
mpz_t r;
mpz_t raiz_n;
gmp_randstate_t state;
if (argc!=3) {
printf("%s <num bits primo 1> <num bits primo 2>\n",argv[0]);
return 0;
}
mpz_init (n);
mpz_init (p);
mpz_init (q);
mpz_init (r);
mpz_init (raiz_n);
/* Generamos dos primos aleatorios */
gmp_randinit_default (state);
while (mpz_probab_prime_p (p, 5)==0) mpz_urandomb (p, state, atoi(argv[1]));
while (mpz_probab_prime_p (q, 5)==0) mpz_urandomb (q, state, atoi(argv[2]));
gmp_printf ("%Zd * %Zd", p, q);
mpz_mul (n, p, q);
gmp_printf (" = %Zd\n", n);
mpz_set_str (n, argv[1], 10);
/* parte_entera(raiz(n)) */
mpz_sqrt (raiz_n, n);
/* Necesitamos un numero impar */
if (mpz_even_p (raiz_n)) mpz_add_ui (raiz_n, raiz_n, 1);
/* Inicializamos valores */
mpz_set (q, raiz_n);
while (mpz_cmp_ui (q, 2) > 0) {
if (mpz_probab_prime_p (q, 5) > 0) {
mpz_cdiv_qr (p, r, n, q);
if (mpz_cmp_ui (r, 0) == 0) {
gmp_printf ("\np:%Zd q:%Zd\n", p, q);
return 0;
}
}
mpz_sub_ui (q, q, 2);
}
gmp_printf ("No encontrado!\n");
gmp_printf ("No es una multiplicacion de dos primos\n");
mpz_clear (n);
mpz_clear (p);
mpz_clear (q);
mpz_clear (r);
mpz_clear (raiz_n);
return 0;
}
|
x=(u+v)/2, y=(v-u)/2 N=x^2-y^2, 0<=y<=x<=N
#include |
#include |