jueves, 6 de diciembre de 2012

Cifrar archivos grandes usando certificado digital de cifrado

Bueno hoy explicare como cifrar archivos grandes usando certificados digitales.
Para iniciar necesitamos un certificado digital (clave publica y tambien su privada). Podríamos obtener este certificado de alguna autoridad certificadora como Verisign o cualquier otra, pero para nuestro ejemplo lo que haremos es crearnos un certificado digital autofirmado, es decir que no dependeremos de nadie y seremos nuestra propiedad emisora de certificado, y usaremos este certificado para cifrar un archivo de backup (archivos grandes).



Primero lo que hago es generar un par de llaves con el comando:

#openssl genrsa -des3 -out private.key 4096

Como veran estoy generando una llave RSA de 4096 (bastante grande ya que el periodo de vigencia del certificado sera de 20 años), ademas le digo que proteja la clave privada con un algoritmo 3des (elijo la contraseña a mi elección).

Luego procedera a generar el pedido de certificado.

#openssl req -new -key private.key -out pedido.csr

con esto ya tengo generado el pedido "pedido.csr" que sera firmado por su misma clave privada (que generamos en el paso anterior).

Entonces procedemos a autofirmar.

#openssl x509 -req -days 7300 -in pedido.csr -signkey private.key -out certificado.crt

Como ven estoy generando el archivo "certificado.crt" que contendrá el certificado auto-firmado que estoy requiriendo para cifrar, ademas le daré un tiempo de vigencia de 20 años (7300). Como ven estoy firmando el pedido con su propia clave privada (auto-firmado).

Ahora que ya tenemos el certificado "certificado.crt" y su clave privada "private.key", ya podemos cifrar usando este certificado.

Primero una aclaración valiosa: Si tratan de cifrar un texto directamente con la llave publica (asimétrica), podría funciona o tal vez no, todo dependerá del tamaño del archivo que quieren cifrar, ya que el tipo de cifrado asimétrico tiene un limite de tamaño del archivo a cifrar, que normalmente no debe ser mayor del tamaño de la clave (clave publica). Entonces aquí se debe saber que en realidad un cifrado por certificado digital es un cifrado simétrico, normalmente usando algoritmos como AES o 3DES. Para ser mas preciso al hacer un cifrado por certificado digital lo que sucede en realidad es que se genera una clave simétrica aleatoria y con esta se cifra el archivo (de gran tamaño), luego esta clave simétrica que no es de un tamaño muy grande es cifrado por la clave publica asimétrica y es enviada junto con el archivo cifrado. Entonces el receptor que tiene llave privada lo primero que hace es descifrar la clave simétrica y luego con esta descifra el archivo (de gran tamaño). esto tiene numerosas ventajas como por ejemplo: un cifrado simétrico es mucho mas rápido que uno asimétrico  Si alguien vio como funciona un servicio https, este modelo es muy parecido.

Bueno con esta aclaración, pasaremos a cifrar el archivo de gran tamaño usando el certificado digital:


#openssl smime -encrypt -binary -aes-256-cbc -in archivo_grande.zip -out archivo_grande.zip.enc -outform DER certificado.crt

Ahora si queremos descifrar necesitaremos nuestra clave privada y ejecutamos:

#openssl smime -decrypt -binary -in archivo_grande.zip.enc -inform DER -out archivo_grande.zip -inkey private.key -passin pass:tu_password

Aquí donde dice tu_password, debes colocar la contraseña que usaste al generar el par de claves (primer paso de este tópico).

NOTA.- Ahora algo adicional, si alguien quiere cifrar un texto usando puramente cifrado asimétrico y usando la clave publica seria así:

#openssl rsautl -pubin -encrypt -in texto_a_cifrar.txt -out salida_cifrada.txt -inkey publica.key

Claro que antes previamente debió derivar la clave publica del par de claves generadas en el primer paso (openssl rsa in private.key -pubout -out publica.key). Pero como mencione si el texto a cifrar es muy grande tendrán un error parecido a "data too large for key size".

NOTA 2.- Si el archivo a cifrar es demasiado grande (algo como 3 gb), podrías tener problemas al hacer este cifrado (error provocado por usar smime que muchas veces no se muestra como error, pero es obvio cuando miras el tamaño del archivo origen y el archivo cifrado y hay bastante diferencia de tamaño (mas de 5 mb)), pero bueno también se puede usar otro modelo de cifrado que funciona perfectamente.

#openssl rand 64 | tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) | openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

Y el comando para descifrar seria:

#openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

No hay comentarios.:

Publicar un comentario