Professional Documents
Culture Documents
jastazv.co – jastazv@gmail.com
Licencia:
Tener todos los conceptos implicados lo suficientemente claros como para explicarlos y poder
graficarlos. Por ejemplo explicar por qué es necesario codificar en ASN.1 y en BER o DER, en lo
posible con ejemplos para el mejor entendimiento y memorización, para la posteridad.
Listado de temas:
Se creará la entidad certificadora o autoridad certificadora (CA) ficticia SYTECSA Security Labs CA
con el objetivo de emitir estos certificados para realizar pruebas.
● Certificado raíz.
● Certificado intermedio.
● Certificado emitido.
Estos tres (3) certificados permiten explicar el concepto de “Chain of Trust” o cadena de confianza
o cadena de certificados:
Nota: Para la ejecución de los comandos referidos en este documento es necesario tener instalado
OpenSSL y agregado al PATH de Windows. Véase documento “Instalación y configuración de
OpenSSL.pdf”.
Es de aclarar que el único certificado auto-firmado (self-signed) es el certificado raíz, es decir, que
sus campos IssuedTo and IssuedBy son iguales y corresponden a SYTECSA Security Labs CA.
Este proceso es el mismo que se realizaría para una entidad certificadora real como Verisign,
Thawte o Digicert, por lo cual es necesario dominar y entender este procedimiento.
¿Por qué comprar un certificado a Verisign, Thawte o Digicert? ¿No me sirve SYTECSA Security
Labs CA?
Dependiendo de los usos de la firma digital, y más en términos generales, de un certificado digital
y del ámbito en el que se requiera que sea reconocido y utilizado, es que se hace necesario
comprar o no un certificado de una entidad como Verisign, Thawte o Digicert.
Por ejemplo para la validación de un servidor o sitio web es necesario que el navegador web o
browser conozca la cadena de confianza para poder verificar la validez del certificado del servidor.
Para esto estas compañías como Verisign, Thawte o Digicert han invertido enormes cantidades de
dinero para que los navegadores, sistemas operativos y diversas aplicaciones, incluyan sus
certificados raíz e intermedios (pueden tener diferentes certificados intermedios dependiendo del
uso) y permitan que todos los usuarios puedan validar los certificados emitidos para los servidores
a los que se conectan a través de sus navegadores. Por ejemplo, en este enlace se pueden ver los
certificados de CA que incluye el Mozilla Firefox:
https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/included/. Notar
que sólo se incluyen los certificados raíces, ¿por qué no se incluyen lo intermedios? En la
validación de la cadena de certificados…. El servidor web debe tener los certificados intermedios
instalados y en el momento de la comunicación (más específicamente el handshaking de
OpenSSL), se envía la lista de certificados (certificate bundle) para que el cliente pueda realizar la
validación del certificado del servidor verificando que la cadena de validación sea válida para
alguno de los certificados raíz en el navegador. Los certificados que incluyen el Mozilla Firefox o
Windows por defecto se conocen como Trust Anchors (traducido anclas de confianza, véase
http://en.wikipedia.org/wiki/Trust_anchor), son los puntos finales en la cadenas de confianza y en
donde termina la validación. Estos son los certificados raíz de CA que vienen preinstalados con los
navegadores y con el Sistema Operativo.
Mozilla Firefox tiene su propia lista en todas las plataformas. Internet Explorer y Google Chrome
utilizan el almacén de certificados de Windows.
Los certificados pueden tener diferentes usos, por ejemplo, véase listado:
http://wiki.aaf.edu.au/tech-info/certificate-management
Nota: Las longitudes de llave de los diferentes certificados pueden ser diferentes. Por ejemplo, la
llave privada del certificado raíz puede ser de 4096, la del certificado intermedio puede ser de
2048 y la del certificado del cliente/empresa puede ser de 1024. También pueden ser todos de
1024, 2048 o 4096, sin embargo, se recomienda no usar longitudes de 1024 ya que la seguridad
para esta longitud ya se ha visto comprometida (ver
https://www.globalsign.eu/ssl-information-center/1024-bit-public-and-private-keys.html. Para
diferentes recomendaciones en la selección de la longitud de la llave privada véase
http://www.keylength.com/en/4/).
Un esquema práctico sería usar llaves de 2048 tanto para el certificado intermedio y el certificado
del cliente/empresa y llave de 4096 para el certificado raíz.
● Autenticación del cliente: verifica la identidad del cliente a partir del intercambio y
validación de certificados.
● Autenticación del servidor: verifica la identidad del servidor a partir del intercambio y
validación de certificados.
● Privacidad en la comunicación: encripta en un canal seguro la información que se
intercambia entre clientes y servidores.
● Integridad en la comunicación: garantiza la integridad del contenido de los mensajes que
son intercambiados entre clientes y servidores al garantizar que los mensajes no han sido
alterados durante la transmisión.
Algoritmo RSA
Para hacerse una idea del tiempo que puede tomar factorizar un entero de 2048 bits en factores
de dos números primos véase http://www.digicert.com/TimeTravel/math.htm.
Recomendaciones de seguridad
Se recomienda utilizar una llave para diferente para la encripción y para la firma, sin embargo, con
el objetivo de simplificar el ejemplo, utilizaremos la misma llave para encripción y firmado.
Para entender, se debe revisar el concepto del algoritmo RSA. Véase para claridad:
http://tools.ietf.org/html/rfc3447#section-5.1
La llave pública es conocida por todos y se utiliza para encriptar. Los mensajes encriptados con la
llave pública sólo pueden ser des-encriptados por la llave privada en una cantidad de tiempo
razonable, más adelante se entenderá esto del tiempo.
Generación de llaves
La llave pública se compone del módulo n y el exponente público e y la llave privada se compone
de módulo n y el exponente privado d . El exponente público e también se conoce como
exponente de encripción y el exponente privado d también se conoce como exponente de
des-encripción.
La llave privada se utiliza para des-encriptar y firmar y la llave pública se utiliza para encriptar y
verificar firmas.
Encripción
RSA se utiliza para encriptar mensajes de tamaño limitado. Para una longitud de llave de 2048-bits
es posible encriptar datos de hasta 245 bytes de tamaño. Para encriptar mayor cantidad de
información se debe recurrir a algoritmos como AES pues con una llave de 128-bits permite
encriptar datos de hasta 250 millones de Terabytes.
1. Llevar M a un entero m tal que 0 ≤ m ≤ n . Normalmente se encripta el hash o digest del
mensaje M para procesos de firma ya que para realizar encripciones de mayor información
es recomendable utilizar otros algoritmos como AES. Un digest o hash muy empleado es
SHA-1 (véase http://en.wikipedia.org/wiki/SHA-1). Para una llave de 2048-bits es decir 256
bytes, según el estándar PKCS#1 v1.5 se deben destinar 11 bytes de padding por lo que
quedan 256-11 = 245 bytes disponibles para información, como se mencionó al inicio de
esta sección (para referencias sobre el padding según estándar PKCS#1 v1.5 véase
http://tools.ietf.org/html/rfc2313). El padding son bytes que se agregan según un patrón o
estándar de tal forma que la encripción RSA sea más segura y no sea vulnerable a ataques
tipo plaintext (véase
http://en.wikipedia.org/wiki/RSA_(cryptosystem)#Padding_schemes).
En el caso de SHA-1 el digest tiene 20 bytes (160-bits) de longitud. Estos 20 bytes más los 11 bytes
de padding dan 33 bytes que termina siendo un número menor a n cuya longitud es de
256 bytes.
2. Después de tener m se encriptará teniendo como resultado c, el mensaje encriptado, al
realizar la siguiente operación:
c = me (mod n )
uede ser enviado o transmitido para su posterior
Después de realizar estos dos pasos, c p
des-encripción.
Des-encripción
m = cd (mod n )
Firma
s = md (mod n )
Verificación
m = se (mod n )
A continuación se provee un ejemplo numérico de cómo sería todo el proceso del algoritmo RSA
para encriptar, des-encriptar, firmar y verificar tendiendo que el mensaje es la letra equis
mayúscula “X”:
M = {′X ′}
Este texto consta de 1 caracteres, es decir, 1 byte. Representada en hexadecimal sería: (Para
realizar conversión de ASCII a hexadecimal véase http://www.asciitohex.com/)
m = 0x58
m = 88
(Para realizar conversión de hexadecimal a decimal utilizar:
http://easycalculation.com/hex-converter.php).
Este número es el mensaje que encriptará y firmará. Con el objetivo de simplificar y trabajar con
números pequeños no se realizará padding del mensaje según PKCS#1v1.5. (Para ejemplo con
padding véase http://www.di-mgt.com.au/rsa_alg.html#signpkcs1).
Nota: Para la ejecución del programa es necesario tener JDK instalado con variable de entorno
JAVA_HOME apuntando a directorio de JDK y directorio /bin de JDK incluido en el PATH.
Para compilar el programa situarse en el directorio del código y digitar
javac RSAEncruptionCalculator.java
java RSAEncryptionCalculator
Generación de llaves
Esta expresión se calcula según el inverso modular. Para realizar el cálculo del inverso modular
existen diferentes implementaciones en diferentes lenguajes, como se puede ver acá:
#include <stdio.h>
int main(void) {
printf("%d\n", mul_inv(151, 7956));
return 0;
}
2371
Nota: para encontrar implementaciones del cálculo de inverso multiplicativo modular (Module
Multiplicative Inverse) veáse http://rosettacode.org/wiki/Modular_inverse.
También es posible encontrar múltiples implementaciones en lenguaje C++ en
http://comeoncodeon.wordpress.com/2011/10/09/modular-multiplicative-inverse
/.
Por lo tanto,
d = 2371
6. La llave pública sería {n = 8137, e = 151} y la llave privada sería {n = 8137, d = 2371} .
Encripción
Después de tener generadas nuestras llaves pública y privada y teniendo definido nuestro mensaje
m , procederemos a hacer la encripción.
c = 5936
Des-encripción
Entonces,
m = 88
Firma
s = 1585
Verificación
m = 88
Dado que el exponente privado d tiene un orden mucho mayor al exponente público e , los
procesos de des-encripción y firma son mucho más costosos computacionalmente, ya que d es un
número de un orden cercano a la longitud de la llave.
El Teorema del Residuo Chino se utiliza para mejorar el rendimiento y aumentar la velocidad de
cálculo en el algoritmo RSA en la des-encripción y en la firma. Utilizando CRT se puede mejorar la
velocidad de cálculo de la exponenciación modular hasta 4 veces.
m = cd (mod n )
dp = e−1 (mod (p − 1) )
dq = e−1 (mod (q − 1) )
q inv = q −1 (mod p )
dp = 25
dq = 31
q inv = 30
m1 = 88m2 = 9
h = 30 . 79 (mod 103 ) h = 1
m = 9 + 1 .79
m = 88
s = md (mod n )
dp = e−1 (mod (p − 1) )
dq = e−1 (mod (q − 1) )
q inv = q −1 (mod p )
dp = 25
dq = 31
q inv = 30
s1 = 40s2 = 5
h = 30 . 35 (mod 103 ) h = 20
s = 5 + 20 .79
s = 1585
Para una muy buena y completa explicación de ASN.1, BER y DER véase
http://luca.ntop.org/Teaching/Appunti/asn1.html.
Véase http://en.wikipedia.org/wiki/Basic_Encoding_Rules#BER_encoding
ASN.1 se utiliza para definir la estructura de la información de manera abstracta por ende
independiente y genérica. La manera de representar/definir/codificar esa información se través de
reglas de codificación como BER o DER. ASN.1 se utiliza para definir protocolos. Un protocolo es la
estructura de un concepto o estándar.
La codificación en base64 se utiliza para llevar toda esta información binaria a caracteres
imprimibles. Se utiliza bas64 para transferir la información de modo texto ya que en algunos
ambientes la información binaria puede ser interpretada como sentencias de control, por esto se
codifica la información en modo texto (ASCII). Esto permite que información binaria sea más fácil
transferible en medios como HTTP e Email.
Para ver toda la evolución que ha tenido el estándar CMS (Cryptographic Message Syntax) véase
http://tools.ietf.org/html/rfc5652#section-1.1.
http://qistoph.blogspot.com/2012/01/manual-verify-pkcs7-signed-data-with.html
Y en Java:
http://stackoverflow.com/questions/10703416/sign-data-using-pkcs-7-in-java
S/MIME es un protocolo para email/correo seguro. Utiliza a CMS para la parte criptográfica
(encripción, firmado) y agrega unas reglas y definiciones en el uso de CMS en el ámbito de los
correos.
La implementación de base de datos de certificados provee los mecanismos para encontrar los
certificados en el path de certificación según su RDN y serialNumber.
Por esa razón, se muestra cómo generar tanto el certificado raíz como el certificado intermedio.
Para la validación de la firma digital en el equipo es necesario que se encuentren ambos
certificados, tanto el certificado raíz como el certificado intermedio, en el “Almacén de
certificados de Windows”. Nótese que no es necesario realizar la importación del certificado
emitido al cliente/empresa.
3. ASDFADSF
4. Asdfasdfasd
5.
version Version,
modulus INTEGER, n
publicExponent INTEGER, e
privateExponent INTEGER, d
prime1 INTEGER, p
prime2 INTEGER, q
Los últimos tres valores se pueden entender según el Teorema del Residuo Chino:
http://en.wikipedia.org/wiki/RSA_(algorithm)#Using_the_Chinese_remainder_algorithm
¿Qué es PEM?
Privacy Enhanced Mail es un estándar que no tuvo mucho uso y hoy se considera inactivo o
muerto. Algunos remanentes de este estándar para privacidad en correo quedan como lo son los
encabezados de los diferentes formatos de archivo en PKI, sin embargo estos formatos no están
estandarizados y son básicamente convenciones históricas.
Referencias