introducción a la seguridad

Transcripción

introducción a la seguridad
INTRODUCCIÓN A LA
SEGURIDAD
Seguridad
• Cuando usas una computadora
usualmente usa un nombre y un
password (clave / contraseña )
para autenticarte.
“Algoritmos de Cifrado”
Algoritmos de cifrado
aes128-cbc
aes192-cbc
aes256-cbc
Descripción
AES(Advanced Encryption Standerd) estándar adoptado por el gobierno de
U.S.A. que remplazó a DES/3DES. AES también es conocido como el
algoritmo de encrypcion Rijndael, el cual es mas rápido. El número después
del nombre del algoritmo es el tamaño de cifrado que usa.
3des-cbc
DES y 3DES son los primeros algoritmos de encriptamiento disponibles.
Desarrollados por la NSA (Nacional Security Agency de USA), a principios
de los 70. estos algoritmos han sido susceptibles a análisis criptográfico, por
lo que no son muy recomendados si se tiene otros algoritmos
blowfish-cbc
Blowfish es un algoritmo de cifrado en bloque con llave simétrica diseñado
por Schneier que usa una llave de tamaño variable y un bloque de 64 bits. La
llave puede ser de 32 a 448 bits. Los datos son filtrados por la función de
encriptamiento 16 veces
cast128-cbc
CAST-128 es un algoritmo parecido a DES que tiene buena resistencia al
arcfour
análisis criptográfico.
Arcfour es un algoritmo basado en RC4 y SHA-1, simétrico y de stream.
Tiene un nivel bajo en seguridad
Protocolos de uso general y
particulares
PROTOCOLO
CyberCash
PROPÓSITO
Transacciones
electrónica de Fondos
DNSSEC
Sistemas de Dominio de
Nombres
IPSec
Encripción a nivel de
paquete
Algoritmos
• RSA ( Rivest, Shamir, Adelman)
• ElGamal( Taher ElGamal)
Protocolos de uso general y
particulares
PROTOCOLO
• PCT
• PGP
• S/MIME
• S-HTTP
PROPÓSITO
Encriptamiento a nivel de
TCP/IP
• Correo electrónico
• Correo electrónico
• El desplegado en WEB
Seguridad
• Proveer identificación
llamado Autenticación
( autentificación ).
es
Definición de Criptografía
• Criptografía es la ciencia de la escritura
secreta, es un brazo de las matemáticas, la
criptología, tiene otro hijo, que es el
criptoanálisis y esta es la ciencia que analiza la
criptografía. Las acciones principales de
seguridad en las aplicaciones están dirigidas
por la criptografía. Principalmente, las
aplicaciones necesitan asegurarse que los
usuarios son quienes dicen ser.
Seguridad
• La criptología provee soluciones.
• La criptología provee métodos más
seguros, llamados firmas y
certificados.
Seguridad
• La seguridad en las aplicaciones
están
dirigidas
por
la
criptografía.
Criptografía
Todos los sistemas criptográficos,
sin importar su complejidad tienen
las siguientes cuatro partes
básicas:
.
.
.
.
Criptografía
1.2.3.4.-
Plaintext ( texto en claro)
Texto cifrado
Algoritmo de encripción
Llave
Criptografía
• Texto cifrado
Este es el mensaje en texto en claro
que ha sido modificado para hacerlo
ilegible. El proceso de convertir texto
en claro a texto cifrado se dice
encriptar y la operación inversa es
desencriptar.
Criptología
• Algoritmo de encripción
Esta es la operación para
convertir texto en claro en texto
cifrado y viceversa.
• Aun datos en el disco duro de una computadora están disponibles
para los compañeros de trabajo, ó cualquiera otra persona que
tenga acceso físico a la computadora. Para proteger los datos del
disco duro, es posible encriptarlos antes de escribirlos en el disco. Y
desencriptar el texto cifrado cuando se quiera ver la información (ó
cuando requieras imprimirlos el archivo). Como ejemplo de un
cifrador podemos hablar del ROT13. El ROT13.es un cifrador muy
simple.
• El algoritmo del ROT13 simplemente rota cada carácter de un
mensaje 13 posiciones. ROT13 originalmente se desarrollo para
ocultar posibles bromas (chistes) ofensivos en los news grups en
internet.
• Si la información era vista por otra persona no lo entendería. Para
revisar la información es necesario desencriptarla. El ROT13 no es
seguro.
• Los cifradores útiles usan llaves para encriptar y desencriptar datos.
Criptología
• Llave
Este es una llave secreta usada para encriptar
ó desencriptar el mensaje.
Cada llave
transforma el mismo texto en claro en un
diferente texto cifrado. Si el sistema funciona
bien, solamente las personas que conocen la
llave correcta pueden descifrar el texto
cifrado.
Criptología
La criptología nos permite que el texto
cifrado pueda ser transmitido a través
de canales públicos de comunicación
inseguros aun si el texto cifrado es
interceptado no tiene ninguna utilidad
si no se tiene la llave de
desencriptamiento.
Criptología
• Antes de la llegada de las computadoras
digitales el texto en claro, el texto cifrado y
la llave estaban en forma de texto leído
por humanos.
• Ahora son cadenas arbitrarias de
información binaria.
• Vídeo, sonido y software pueden ser
encriptadas tan fácil como el texto en
claro.
Criptología
Una importante característica de
un buen sistema es que la
seguridad del sistema depende
completamente en la secrecía
de
la
llave
de
desencriptamiento.
Criptografía
• No es necesario guardar en
secreto
el
algoritmo
de
encriptamiento.
• Permite al algoritmo a ser rehusado
por muchas personas y evita la
necesidad de proteger el software
de encriptamiento.
Criptografía
El texto cifrado puede ser “craked”
(roto) y leído por usuarios no
autorizados en varias formas.
Una forma es a través del criptoanálisis
Criptografos entrenados analizan el
texto cifrado en busca de patrones
residuales dejados desde el texto en
claro.
Criptografía
Cualquiera de estos patrones pueden
ser usadas para reconstruir el
mensaje original ó la llave usada para
encriptar.
Un
buen
algoritmo
de
encriptamiento es uno que no
genera estos patrones.
Criptografía Simétrica
• Significa que la misma llave secreta
es usada para encriptar y
desencriptar el mensaje.
• Fueron los primeros algoritmos.
Criptografía Asimétrica
• Los cifradores asimétricos (también llamados
cifradores de llaves públicas) involucran una
llave pública, que puede ser libremente
distribuida, y una llave privada, que puede
ser secreta. Estas llaves siempre son
generadas en parejas. Llaves públicas
realmente son públicas, se puede publicarlas
en un periódico, pero nadie puede violar tú
privacidad sin la llave privada. El mecanismo
de distribuir las llaves públicas, sin embargo,
es un gran reto.
Criptografía
Algunos algoritmos simétricos:
•
•
•
•
•
DES (Data Encryption Standard)
Triple DES
RC2, RC4, RC5
IDEA
Blowfish
 Una de las llaves se llama la llave pública y se
distribuye ampliamente.
 La otra llave llamada privada y es guardada en
secreto.
 Para enviar un mensaje se encripta con la llave
pública de la persona de la que le quieres
enviar, esta persona usa su llave privada para
desencriptar el mensaje.
• La principal limitación de la criptografía de
la llave pública es velocidad.
• La implementación más rápida de RSA es
miles de veces más lenta que los algoritmos
simétricos.
• Esto los hace imprácticos para encriptar
mensajes largos.
• Generalmente los sistemas mezclan a los
algoritmos de llave pública y simétrica.
Firmas Digitales:
 Los algoritmos de llave pública permite
también crear firmas digitales.
 Mensajes encriptados usando la llave privada
solo pueden ser desencriptados usando la
llave pública.
 Esto crea declaraciones de identidad(firmas
digitales).
Integridad de Mensajes
• El encriptamiento no asegura la integridad de
los mensajes
• MD4 y MD5 son funciones de hash(dispersión)
en un solo sentido que generan cadenas de
128 bits
• MD5 es un reemplazo de MD4 después de
haber detectado ciertas debilidades
Estas funciones actúan como huellas
digitales de los mensajes originales.
Si se integran a los mensajes
encripados nos aseguran que nadien
modificó el mensaje y que además el
mensaje esta integro.
Sobres digitales
• Aunque los sistemas de encripción pública son
ideales para Internet tiene un problema muy
grave, son de ordenes de magnitud más lento
que los sistemas simétricos.
• Los sistemas simétricos tiene el problema de
distribución de la llave.
La solución es mezclar los dos.
1.- Genera una llave secreta random para un
algoritmo simétrico
2.- Encrpita la llave secreta con la llave
pública y enviala
3.- El receptor desencripta el mensaje con su
llave privada y obtiene la llave secreta
4.- Las dos partes tiene una llave para un
algoritmo simétrico
Certifying authorities (autoridades certicadoras
o Cas)
• Dos problemas prácticos de los algoritmos de
llave pública son:
– El estar seguro que la llave pública es de quien
dice ser su dueño
– El número de llaves públicas que se tienen que
guardar
• Una solución a esto son los CAs para la
validación de las llaves públicas
• los CAs son compañías que dan fe de la
identidad de individuos y organizaciones
• En lugar de tener la llave pública de todo
mundo en tu disco duro solo guardas las llaves
públicas de unos cuantos Cas conocidos
• Los certificados no son más que mensajes
encriptados con la llave privada de un CA que
contiene la llave pública del individuo así
como sus datos
DES Y 3DES DESARROLLADAS EN
LOS LENGUAJES JAVA, PERL Y #C
Código en lenguaje Java
Ejemplo de uso de JCE 1.2.1
Java Cryptography Extension 1.2.1
/*
Este programa encrypta/desencrypta con DES y 3DES
( TRIPLEDES )
Se puedesn usar llaves de 8 o 24 bytes ( para DES o
3DES )*/
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.SecretKeyFactory.*;
public class td {
public static void main(String[] args) {
int i,largo;
String NombreAlgo;
/* esta es la base para la llave */
byte [] a = {
(byte) 1, (byte)2, (byte)3, (byte)4,
(byte)5, (byte)6, (byte)7, (byte)8,
(byte) 1, (byte)2, (byte)3, (byte)4,
(byte)5, (byte)6, (byte)7, (byte)8,
(byte) 1, (byte)2, (byte)3, (byte)4,
(byte)5, (byte)6, (byte)7, (byte)8,};
SecretKey key = null;
boolean dir; /* si encripta o desencripta */
boolean algo; /* si des o 3des */
if( args.length != 4 ){
System.out.println(
"Uso: encripta {e|d|E|D} llave archivo1 archivo2");
/*
e : encripta con DES
d : desencripta con DES
E : encripta con 3DES
D : desencripta con 3DES
*/
System.exit(1);
}
if( args[0].equals("e") && args[0].equals("d") && args[0].equals("E") && args[0].equals("D")){
System.out.println(
"Uso: encripta {e|d|E|D} llave archivo1 archivo2");
System.exit(1);
}
/* dinamicamente configuramos a SunJCE */
Security.addProvider( new com.sun.crypto.provider.SunJCE() );
/* dir es true si encripta */
dir = args[0].equals("e") || args[0].equals("E") ;
/* algo es el algoritmo, si es true = DES es flase = 3DES */
algo = args[0].equals("e") || args[0].equals("d") ;
if( algo ) NombreAlgo = "DES";
else NombreAlgo = "DESede";
if( algo ) largo = 8;
else largo = 24;
if( args[1].length() < largo )
largo = args[1].length();
for(i=0;i<largo;i++)
a[i] = (byte) args[1].charAt(i);
try {
if( algo ){ // DES
DESKeySpec dks = new DESKeySpec( a );
SecretKeyFactory kf =
SecretKeyFactory.getInstance(NombreAlgo);
key = kf.generateSecret(dks);
}
else { // DESede
DESedeKeySpec dks = new DESedeKeySpec( a );
SecretKeyFactory kf =
SecretKeyFactory.getInstance(NombreAlgo);
key = kf.generateSecret(dks);
}
}
catch( InvalidKeyException ik ){
System.out.println("LLAVE INVALIDA, adios");
System.exit(1);
}
catch( NoSuchAlgorithmException ex ){
System.out.println(" No encontre a " + NombreAlgo);
System.exit(1);
}
Cipher ci = null;
try {
if( algo ) // DES
ci = Cipher.getInstance("DES/ECB/PKCS5Padding");
else // 3DES
ci = Cipher.getInstance("DESede/ECB/PKCS5Padding");
if( dir ) ci.init(Cipher.ENCRYPT_MODE,key);
else ci.init(Cipher.DECRYPT_MODE,key);
}
catch( InvalidKeyException ik ){
System.out.println("LLAVE INVALIDA, adios ups");
System.exit(1);
}
catch( NoSuchAlgorithmException ex ){
System.out.println(" No encontre a " + NombreAlgo +
"/ECB/PKCS5Padding");
System.exit(1);
}
catch( NoSuchPaddingException ex ){
System.out.println(" No encontre a " + NombreAlgo +
"/ECB/PKCS5Padding");
System.exit(1);
}
if( dir ) encripta(ci,args[2],args[3]);
else
desencripta(ci,args[2],args[3]);
}
public static void encripta(Cipher ci, String entrada, String
salida){
try {
BufferedInputStream l = new BufferedInputStream (
new FileInputStream(entrada));
CipherOutputStream esc = new CipherOutputStream(
new BufferedOutputStream (
new FileOutputStream(salida)), ci);
int c;
while( ( c = l.read() ) != -1 )
esc.write(c);
l.close();
esc.close();
}
catch( IOException exiii){
System.out.println("Error de lectura o escritura");
System.exit(1);
}
}
public static void desencripta(Cipher ci, String entrada, String
salida){
try {
CipherInputStream le = new CipherInputStream(
new BufferedInputStream (
new FileInputStream(entrada)),ci);
BufferedOutputStream esc = new BufferedOutputStream (
new FileOutputStream(salida));
int c;
while( ( c = le.read() ) != -1 )
esc.write(c);
le.close();
esc.close();
}
catch( IOException exiii){
System.out.println("Error de lectura o escritura");
System.exit(1);
}
}
}
#!/usr/local/bin/perl -w
Lenguaje Perl
#
# Encripta y desencripta con DES y 3DES (DES_EDE3)
# en perl
#
use Crypt::CBC;
use strict;
my($cipher,$algo,$key,$arch_entrada,$arch_salida);
my($uso,$dir,$nombrealgo,$buffer,$l);
$uso = "Uso: encripta {e|d|E|D} llave archivo1
archivo2\n";
$algo = shift @ARGV;
$key = shift @ARGV;
$arch_entrada = shift @ARGV;
$arch_salida = shift @ARGV;
if( index("edED",$algo) == -1 || length($algo) != 1 ){
print $uso;
exit 1;
}
# dir es true si encrypta
$dir = ( $algo eq 'e' || $algo eq 'E' );
# algo es el algoritmo, true si es DES o false si es
3DES ( DES_EDE3)
$algo = ( $algo eq 'e' || $algo eq 'd' );
# el nombre del algoritmo
$nombrealgo = $algo ? "DES" : "DES_EDE3";
$cipher = new Crypt::CBC($key,$nombrealgo);
open(ENTRADA,$arch_entrada) or die "Error al abrir
a $arch_entrada;$!";
open(SALIDA,">$arch_salida") or die "Error al abrir a
$arch_salida;$!";
print ( $dir ? 'encrypting' : 'decrypting' );
$cipher->start( $dir ? 'encrypting' : 'decrypting' );
while( sysread(ENTRADA,$buffer,1024) ){
$l = $cipher->crypt($buffer);
syswrite(SALIDA,$l, length($l));
}
$l = $cipher->finish();
syswrite(SALIDA,$l, length($l));
close ENTRADA;
close SALIDA;
Lenguaje #C
/*Versión del algoritmo DES y 3DES(tripleDES) en
lenguaje #C */
using System.Globalization;
using System.Runtime.InteropServices;
namespace System.Security.Cryptography
{
#if NET_2_0
[ComVisible (true)]
#endif
public abstract class DES : SymmetricAlgorithm
{
private const int keySizeByte = 8;
#if NET_2_0
protected DES ()
#else
public DES ()
#endif
{
KeySizeValue = 64;
BlockSizeValue = 64;
FeedbackSizeValue = 8;
LegalKeySizesValue = new KeySizes[1];
LegalKeySizesValue[0] = new KeySizes(64, 64, 0);
LegalBlockSizesValue = new KeySizes[1];
LegalBlockSizesValue[0] = new KeySizes(64, 64, 0);
}
public static new DES Create ()
{
return Create ("System.Security.Cryptography.DES");
}
public static new DES Create (string algo)
{
return (DES) CryptoConfig.CreateFromName (algo);
}
internal static sololectura byte[,] weakKeys = {
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F },
{ 0xE1, 0xE1, 0xE1, 0xE1, 0xF1, 0xF1, 0xF1, 0xF1 },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
};
internal static sololectura byte[,] semiWeakKeys = {
{ 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0E },
{ 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF0 },
{ 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE },
{ 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0E, 0x00 },
{ 0x1E, 0xE0, 0x1E, 0xE0, 0x0E, 0xF0, 0x0E, 0xF0 },
{ 0x1E, 0xFE, 0x1E, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
{ 0xE0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00 },
{ 0xE0, 0x1E, 0xE0, 0x1E, 0xF0, 0x0E, 0xF0, 0x0E },
{ 0xE0, 0xFE, 0xE0, 0xFE, 0xF0, 0xFE, 0xF0, 0xFE },
{ 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00 },
{ 0xFE, 0x1E, 0xFE, 0x1E, 0xFE, 0x0E, 0xFE, 0x0E },
{ 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF0, 0xFE, 0xF0 },
};
public static bool IsWeakKey (byte[] rgbKey)
{
#if NET_2_0
if (rgbKey == null)
throw new CryptographicException (Locale.GetText ("No hay
llave"));
#endif
if (rgbKey.Length != keySizeByte)
throw new CryptographicException (Locale.GetText ("Longitud
de llave incorrecta"));
for (int i=0; i < rgbKey.Length; i++) {
switch (rgbKey [i] | 0x11) {
case 0x11:
case 0x1F:
case 0xF1:
case 0xFF:
break;
default:
return false;
}
}
for (int i=0; i < (weakKeys.Length >> 3); i++) {
int j = 0;
for (; j < rgbKey.Length; j++) {
if ((rgbKey [j] ^ weakKeys [i,j]) > 1)
break;
}
if (j==8)
return true;
}
return false;
}
}
if (j==8)
return true;
}
return false;
}
public static bool IsSemiWeakKey (byte[] rgbKey)
{
#if NET_2_0
if (rgbKey == null)
throw new CryptographicException (Locale.GetText
("No hay llave"));
#endif
if (rgbKey.Length != keySizeByte)
throw new CryptographicException (Locale.GetText
("Longitud de llave incorrecta"));
for (int i=0; i < rgbKey.Length; i++) {
switch (rgbKey [i] | 0x11) {
case 0x11:
case 0x1F:
case 0xF1:
case 0xFF:
break;
default:
return false;
}
}
for (int i=0; i < (semiWeakKeys.Length >> 3);
i++) {
int j = 0;
for (; j < rgbKey.Length; j++) {
if ((rgbKey [j] ^ semiWeakKeys [i,j]) > 1)
break;
}
if (j==8)
return true;
}
return false;
}
public override byte[] Key {
get {
if (KeyValue == null) {
GenerateKey ();
}
return (byte[]) KeyValue.Clone ();
}
set {
if (value == null)
throw new ArgumentNullException
("Llave");
if (value.Length != keySizeByte)
throw new ArgumentException
(Locale.GetText ("Longitud de llave
incorrecta"));
if (IsWeakKey (value))
throw new CryptographicException
(Locale.GetText ("Llave dévil"));
if (IsSemiWeakKey (value))
throw new CryptographicException
(Locale.GetText ("Llave semi dévil"));
KeyValue = (byte[]) value.Clone ();
}
}
}
}

Documentos relacionados