Download Reporte 8

Document related concepts
no text concepts found
Transcript
Universidad Nacional Autónoma de México
Facultad de Ingeniería
Laboratorio de Administración de Redes
Becerril López Sergio Andrés
Farfan Peñaloza Marcos Jair
Grupo 10
Reporte de Práctica 8a
Entrega: 06/05/08
Desarrollo
Comenzamos hablando un rato acerca de los conceptos de seguridad básicos, asi como los dos tipos generales de encriptación: criptografía de llave privada (también llamada tradicional o simétrica) y criptografía de llave pública (también llamada asimétrica), sus similitudes y diferencias, y sus ventajas y desventajas.
Después de establecer algunos conceptos (ver cuestionario), comenzamos con la transcripción del programa, el cual es una sencilla implementación de encriptación de llave pública, en su forma de firma digital. Básicamente, lo que el programa realiza es la implantación de la firma digital en el documento, así como la autenticación de esta firma (en realidad son dos códigos). La generación de la firma digital se realiza en base a un algoritmo predeterminado (RSA).
El código de ambos se adjunta:
GeneraFirma.java
VerificaFirma.java
import java.io.*;
import java.security.*;
class GeneraFirmaSABL
{
public static void main (String [] args)
{
/*Verificando el numero de argumentos de entrada*/
if (args.length!=1)
{
System.out.println ("Sintaxis del programa es: java GeneraFirmaSABL archivoaFirmar");
}
else try
{
KeyPairGenerator genClave=KeyPairGenerator.getInstance("RSA");
SecureRandom aleatorio=SecureRandom.getInstance("SHA1PRNG","SUN");
genClave.initialize(1024, aleatorio);
KeyPair pardeClaves= genClave.generateKeyPair();
PrivateKey privada=pardeClaves.getPrivate();
PublicKey publica=pardeClaves.getPublic();
Signature firma=Signature.getInstance ("MD5withRSA");
firma.initSign(privada);
FileInputStream archivo=new FileInputStream(args[0]);
BufferedInputStream buferEntrada=new BufferedInputStream(archivo);
byte[] buffer=new byte[1024];
int longitud;
while (buferEntrada.available() !=0)
{
longitud =buferEntrada.read(buffer);
firma.update(buffer, 0, longitud);
}
buferEntrada.close();
byte[] firmaReal=firma.sign();
/*Guardando los datos firmados en un import java.io.*;
import java.security.*;
import java.security.spec.*;
class VerificaFirmaSABL
{
public static void main (String [] args)
{
/*Verificando el numero de argumentos de entrada*/
if (args.length!=3)
{
System.out.println
("Sintaxis del programa es: java VerificaFirmaINICIALES archivoaFirmarINICIALES.TXT clavepublicaINICIALES.TXT firmaArchivo");
}
else try
{
FileInputStream clavepublica=new FileInputStream (args[0]);
byte[] clave=new byte[clavepublica.available()];
clavepublica.read(clave);
clavepublica.close();
X509EncodedKeySpec pubKeySpec=new X509EncodedKeySpec(clave);
KeyFactory keyFactory = KeyFactory. getInstance("RSA");
PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
FileInputStream archivoFirmado=new FileInputStream(args[1]);
byte[] firmaVerificada=new byte[archivoFirmado.available()];
archivoFirmado.read(firmaVerificada);
archivoFirmado.close();
Signature firma=Signature.getInstance ("MD5withRSA");
firma.initVerify(pubKey);
FileInputStream datos=new FileInputStream(args[2]);
BufferedInputStream buferEntrada=new BufferedInputStream(datos);
byte[] buffer=new byte[1024];
int longitud;
archivo*/
FileOutputStream archivoFirma=new FileOutputStream("firmaSABL.txt");
archivoFirma.write(firmaReal);
archivoFirma.close();
/*Guardando la clave pública en un archivo*/
byte[] clave=publica.getEncoded();
FileOutputStream clavePublica=new
}
FileOutputStream("clavePublicaSABL.txt");
clavePublica.write(clave);
clavePublica.close();
}
catch (Exception e)
{
System.out.println("El error es " + e) ;
}
}
buferEntrada.read(buffer);
while (buferEntrada.available() !=0)
{
longitud= firma.update(buffer,0,longitud);
}
buferEntrada.close();
boolean verifica=firma.verify(firmaVerificada);
System.out.println ("Verificación de la firma " +verifica);
}
catch (Exception e)
{
System.err.println ("El erros es de "+ e.toString() );
}
}
}
Cuestionario
1. Investigue el objetivo de la firma digital.
El objetivo de la firma digital es autenticar el originador del archivo (u objeto, en general) que se encuentra firmado; esto para garantizar la integridad de los datos.
2. Investigue los 2 algoritmos hash, más utilizados en la actualidad.
SHA­1 y MD5 (ambos son algoritmos hash criptográficos).Investigue la principal desventaja de la criptografía tradicional.
3. Investigue la principal desventaja de la criptografía tradicional.
Que la llave debe ser resguardada a toda costa; si esta es revelada, toda la cadena está comprometida.
4. Investigue el algoritmo de cifrado más comúnmente utilizado por [cifrado de llave pública].
RSA.
5. Investigue el uso de las sentencias try y catch dentro del lenguaje java.
Se utilizan para control de errores; en 'try' está el código a ejecutarse 'normalmente', mientras que 'catch' alberga el código a ejecutarse de encontrar un error.
6. Investigue el funcionamiento del método getPrivate y getPublic.
Son los métodos que nos regresan las referencias a las llaves Privada y Pública, respectivamente. Son parte de la clase keypair; no toman argumentos.
7. De acuerdo al diagrama anterior, indique los argumentos que debe recibir el programa que verifica la firma digital de un documento.
El documento a verificar, la firma digital (o en su defecto la llave pública).
8. Investigue el contenido básico del estándar X.509.
Es el estándar internacional (desarrollado por la ITU) que establece la normatividad para la infraestructura de llave pública y la infraestructura de administración de privilegios (PMI, por sus siglas en inglés).
9. Investigue el error obtenido en el punto anterior.
El error:
C:\practica8asabl>java VerificaFirmaSABL clavepublicaSABL.txt firmaSABL.txt datosaFirmar.txt
java.security.spec.InvalidKeySpecException: java.security.Invalid
KeyException: IOException: DerInputStream.getLength(): lengthTag=126, too big.
Y lo que nos indica es que la llave de seguridad es inválida, ya que la longitud es mayor a la esperada; lo cual es el comportamiento que esperamos, aunque este error ciertamente debería ser manejado en el código.
10. Defina el escenario que representa el punto anterior.
Es un escenario donde un atacante ha obtenido acceso al archivo original, sin firmar. Obviamente el peor caso en nuestra infraestructura.
Conclusiones
Becerril López Sergio Andrés
Pues me pareció una práctica con mucho potencial, el problema es que por falta de tiempo no se puede estudiar a detalle el algoritmo que se utiliza en el programa, así que si sabes programar pues le entiendes de volada, pero si no, la práctica se queda corta. Convendría tal vez incluir en el cuestionario preguntas específicas al código, para que se pudiera reafirmar (o en su caso, obtener) el conocimiento acerca de la práctica.
Farfan Peñaloza Marcos Jair
Para esta practica usamos la criptografia como arma principal (materia que voy cursando), me di cuenta de una aplicacion ya que en clase solo se habla de ella y sus ejemplos pero nunca hemos visto una aplicacion real, para esta practica casi nada fue complicado lo unico pues cambiar un poco el codigo para que compilara, de esta ,manera al ejecutarlo nos daba el mensaje cifrado y al cambiar la firma funcionada bien.