Criptografia - Firma digital RSA

 
Vista:

Firma digital RSA

Publicado por Laura (2 intervenciones) el 15/02/2007 11:27:45
Hola.
Tengo un problema con mi firma digital, si escribo una palabra entonces me la hace perfecta, si pongo otras palabras, entonces me las hace a medias o bien la mitad primera o bien la mitad segunda de la palabra...

Yo programo en java y mi código es algo así...

package proyecto.encriptacion;

/**
*
* @author Laura Carrasco Nicolás
*/
public class numeros {

/** Creates a new instance of numeros */
public numeros() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String firma = new String();
firma = "amparo";

long p1, q1;
long p2, q2;

int numCarBloque = 0;
int numCaracteres = 0;
int numBloques = 0;

p1 = 5179;
q1 = 6323;
p2 = 9767;
q2 = 9341;
EleccionDeClaves edc1 = new EleccionDeClaves(p1,q1);
EleccionDeClaves edc2 = new EleccionDeClaves(p2,q2);

edc1.claveN = edc1.calcularN();
edc1.fiDeN = edc1.calcularFiDeN();
edc1.claveE = 7;
edc1.teoremaDeEuclidesExtendido();

edc2.claveN = edc2.calcularN();
edc2.fiDeN = edc2.calcularFiDeN();
edc2.claveE = 3;
edc2.teoremaDeEuclidesExtendido();

//EL EMISOR DE LA FIRMA ES EL USUARIO 2... EL 1 ES SÓLO EL DESTINATARIO.
System.out.println("CLAVE 1 = " + edc1.claveD + " " +edc1.claveE + " " +edc1.claveN + " ");
//clave D = 18705895 clave e = 7 clave n = 32746817
System.out.println("CLAVE 2 = " + edc2.claveD + " " +edc2.claveE + " " +edc2.claveN + " ");
//clave D = 60809627 clave e = 3 clave n = 91233547

Criptografia cript1 = new Criptografia(edc1.claveE, edc1.claveN, edc1.claveD);
Criptografia cript2 = new Criptografia(edc2.claveE, edc2.claveN, edc2.claveD);

//rellena la variable en la que se representa el numero de caracteres que tiene el mensaje a codificar.
numCaracteres=firma.length();
System.out.println("num Caracteres = "+numCaracteres);

if(edc2.claveN > 256){
//Determino el número de caracteres por bloque que vamos a almacenar.
numCarBloque = cript2.separarBloques();
//determino el número de bloques que se crearán a partir de la cadena introducida.
numBloques = (numCaracteres/numCarBloque);
if(numCaracteres%numCarBloque != 0){
numBloques = numBloques + 1;
}
} else{
numCarBloque = 1;
numBloques = numCaracteres;
}
System.out.println("numCarBloque = "+numCarBloque+" numBloques = "+numBloques);

//bloques representa el vector de long donde almacenamos los bloques a cifrar.
long[] bloques = new long[numBloques];
for (int i = 0; i < bloques.length; i++) {
bloques[i] = 0;
}

//indice representa el número de caracteres que se han introducido de momento por bloque.
int indice = 0;
//j representa el índice del bloque en el que estamos almacenando los valores.
int j = 0;
//k representa el número de caracteres por bloque que lleva almacenados en cada bloque.
int k = numCarBloque - 1;

System.out.println("CIFRADO DE LA FIRMA");
for (int i = 0; i < firma.length(); i++) {
System.out.println("k = "+k);
//guardo en una variable auxiliar el resultado de elevar
double valor= Math.pow(256, k);

System.out.println("valor de cadena " + ((long)firma.charAt(i)) + " k = "+k);
bloques[j] = bloques[j] + (((long)valor)*((long)firma.charAt(i)));
System.out.println("BLOQUE = "+bloques[j]);

if(k == 0){
k = numCarBloque;
indice = -1;
j = j+1;
}
k = k-1;
indice = indice + 1;
}

for (int i = 0; i < bloques.length; i++) {
bloques[i]=cript2.CElevadoADModuloN(bloques[i], edc2.claveD, edc2.claveN);
System.out.println("SOLO PRIMERA PARTE "+bloques[i]);
bloques[i] = cript1.CElevadoADModuloN(bloques[i],edc1.claveE,edc1.claveN);
System.out.println("SEGUNDA PARTE "+bloques[i]);
}

System.out.println("\n\nDESCIFRADO DE LA FIRMA");
firma = "";
for (int i = bloques.length - 1; i >= 0; i--) {
System.out.println("bloque antes de descifrar = "+bloques[i]);
bloques[i] = cript1.CElevadoADModuloN(bloques[i],edc1.claveD,edc1.claveN);
System.out.println("SEGUNDA PARTE "+bloques[i]);

bloques[i]=cript2.CElevadoADModuloN(bloques[i], edc2.claveE, edc2.claveN);
System.out.println("SOLO PRIMERA PARTE "+bloques[i]);
long aux = bloques[i];

do{
System.out.println("aux = "+aux);
System.out.println("aux%256 = "+(aux%256));
if(aux%256 != 0){
firma = String.valueOf((char)(aux%256)) + firma;
System.out.println("firma = "+firma);
}
else{
firma = "";
}
aux = aux/256;
} while(aux != 0);
}
}
}

donde separar en bloques y calcular C elevado a d modulo n es:
/**
* FUNCIÓN PARA calcular c^d mod n
* @param c Es la base a la que vamos a elevar la siguiente variable
* @param d Es el exponente al que elevamos la c.
* @param n Es el número con el que vamos a hacer el módulo a la potencia c elevado a d.
* @return m Es el resultado de dicho cálculo.
**/
public long CElevadoADModuloN(long c, long d, long n){
long m=1,u;

if((d != 0)&&(n != 0)){
u=c%n;

while(d!=0) {
if(d%2==1) {
m=(m*u)%n; //Si es primo que actualice m.
}
d=d/2; //Cociente

u=(u*u)%n;
}
return m;
}
else{
return 0;
}
}

/**
* Este método sirve para determinar cuantos caracteres formarán los bloques.
* @return i es el número de caracteres que van a formar cada bloque.
**/
public int separarBloques(){
int i=0;

while(Math.pow(256, i) <= this.claveN){
i++;
}

return (i-1);
}

ESPERO QUE ALGUIEN ME PUEDA AYUDAR :(
Un saludo.
Laura
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Firma digital RSA

Publicado por Picajoso (1 intervención) el 27/07/2007 12:08:56
Concreta mas, no me apetece leerme todo el codigo para contestar.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar