Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú
Ejemplo
1.- p=3 y q=11. //numeros primos
2.- n = 3 * 11 = 33.
3.- fi(n) = (3-1) * (11-1) = 20.
4.- Buscamos e=3, tal que MCD(e,fi(n))=1
5.- d = ((Y * fi(n)) + 1) / e = ( Y * 20 + 1) / 3 = 21 / 3 = 7
6.- e=3 y n=33 son la clave pública.
7.- d=7 y n=33 son la clave privada.
Cifrado: Mensaje = 5,
C = M^e mod n => 5^3 mod 33 = 26
Descifrado: C = 26
M = C^d mod n = 26^7 mod 33 => 8031810176 mod 33 = 5
import java.io.*;
import java.math.BigInteger;
public class Main {
/**
* @param argumentos de la linea de comandos
*/
public static void main(String[] args) throws IOException {
if(args.length != 1) {
System.out.println("Sintaxis: java RSA [tamaño de los primos]");
System.out.println("por ejemplo: java RSA 512");
args = new String[1];
args[0]="1024";
}
int tamPrimo = Integer.parseInt(args[0]);
RSA rsa = new RSA(tamPrimo);
System.out.println("Texto a cifrar: ");
String textoPlano = (new BufferedReader(new InputStreamReader(System.in))).readLine();
BigInteger[] textoCifrado = rsa.cifra(textoPlano);
System.out.println("\nTexto cifrado: [");
for(int i=0; i<textoCifrado.length; i++) {
System.out.print(textoCifrado[i].toString(16).toUpperCase());
if(i != textoCifrado.length-1)
System.out.println("");
}
System.out.println("]\n");
String recuperarTextoPlano = rsa.descifra(textoCifrado);
System.out.println("Texto desencritado: ["+ recuperarTextoPlano +"]");
}
}
/*
* RSA.java
*
*
*/
import java.math.BigInteger;
import java.util.*;
/**
*
* @author
*/
public class RSA {
int tamPrimo;
BigInteger n, q, p;
BigInteger totient;
BigInteger e, d;
/** Constructor de la clase RSA */
public RSA(int tamPrimo) {
this.tamPrimo = tamPrimo;
generaPrimos(); //Genera p y q
generaClaves(); //Genera e y d
}
public void generaPrimos()
{
p = new BigInteger(tamPrimo, 10, new Random());
do q = new BigInteger(tamPrimo, 10, new Random());
while(q.compareTo(p)==0);
}
public void generaClaves()
{
// n = p * q
n = p.multiply(q);
// toltient = (p-1)*(q-1)
totient = p.subtract(BigInteger.valueOf(1));
totient = totient.multiply(q.subtract(BigInteger.valueOf(1)));
// Elegimos un e coprimo de y menor que n
do e = new BigInteger(2 * tamPrimo, new Random());
while((e.compareTo(totient) != -1) || (e.gcd(totient).compareTo(BigInteger.valueOf(1)) != 0));
// d = e^1 mod totient
d = e.modInverse(totient);
}
/**
* cifra el texto usando la clave publica
*
* @param mensaje Ristra que contiene el mensaje a cifrar
* @return El mensaje cifrado como un vector de BigIntegers
*/
public BigInteger[] cifra(String mensaje)
{
int i;
byte[] temp = new byte[1];
byte[] digitos = mensaje.getBytes();
BigInteger[] bigdigitos = new BigInteger[digitos.length];
for(i=0; i<bigdigitos.length;i++){
temp[0] = digitos[i];
bigdigitos[i] = new BigInteger(temp);
}
BigInteger[] cifrado = new BigInteger[bigdigitos.length];
for(i=0; i<bigdigitos.length; i++)
cifrado[i] = bigdigitos[i].modPow(e,n);
return(cifrado);
}
/**
* descifra el texto cifrado usando la clave privada
*
* @param cifrado Array de objetos BigInteger que contiene el texto cifrado que seraoct descifrado
* @return The decrypted plaintext
*/
public String descifra(BigInteger[] cifrado) {
BigInteger[] descifrado = new BigInteger[cifrado.length];
for(int i=0; i<descifrado.length; i++)
descifrado[i] = cifrado[i].modPow(d,n);
char[] charArray = new char[descifrado.length];
for(int i=0; i<charArray.length; i++)
charArray[i] = (char) (descifrado[i].intValue());
return(new String(charArray));
}
public BigInteger damep() {return(p);}
public BigInteger dameq() {return(q);}
public BigInteger dametotient() {return(totient);}
public BigInteger damen() {return(n);}
public BigInteger damee() {return(e);}
public BigInteger damed() {return(d);}
}