linux - gpg - generar clave publica y privada openssl
Cómo cifrar un archivo grande en openssl usando una clave pública (7)
Encontré las instrucciones en http://www.czeskis.com/random/openssl-encrypt-file.html útiles.
Parafraseando el sitio vinculado con nombres de archivo de su ejemplo:
Genera una clave simétrica porque puedes encriptar archivos grandes con ella
openssl rand -base64 32 > key.bin
Cifre el archivo grande usando la clave simétrica
openssl enc -aes-256-cbc -salt -in myLargeFile.xml / -out myLargeFile.xml.enc -pass file:./key.bin
Encripte la clave simétrica para que pueda enviarla de manera segura a la otra persona
openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc
Destruye la clave simétrica no encriptada para que nadie la encuentre
shred -u key.bin
En este punto, envía la clave simétrica encriptada (
key.bin.enc
) y el archivo grande encriptado (myLargeFile.xml.enc
) a la otra personaLa otra persona puede descifrar la clave simétrica con su clave privada usando
openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin
Ahora pueden usar la clave simétrica para descifrar el archivo
openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc / -out myLargeFile.xml -pass file:./key.bin
Y tu estas listo. La otra persona tiene el archivo descifrado y fue enviado de manera segura.
¿Cómo puedo cifrar un archivo grande con una clave pública para que nadie más que el que tiene la clave privada pueda descifrarlo?
Puedo hacer claves públicas y privadas de RSA, pero cuando se trata de encriptar un archivo grande usando este comando:
openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml
y cómo puedo realizar el descifrado también ...
creo mi clave privada y pública con los siguientes comandos
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Me sale este error:
RSA operation error
3020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:./crypto/rsa/rsa_pk1.c:151:
Traté de hacer claves con tamaños de 1024 a 1200 bits, sin suerte, el mismo error
No puede encriptar directamente un archivo grande usando rsautl
. en su lugar, haz algo como lo siguiente:
- Genera una clave usando
openssl rand
, ej.openssl rand 32 -out keyfile
- Encriptar el archivo de clave usando
openssl rsautl
- Cifre los datos usando
openssl enc
, usando la clave generada desde el paso 1. - Empaquete el archivo de clave encriptada con los datos encriptados. el destinatario deberá descifrar la clave con su clave privada, luego descifrar los datos con la clave resultante.
No se recomienda cifrar un archivo muy grande utilizando smime ya que es posible que pueda cifrar archivos de gran tamaño con la opción -stream, pero no descifrar el archivo resultante debido a limitaciones de hardware. Vea: descifrado de archivos grandes.
Como se mencionó anteriormente Public-key crypto no es para encriptar archivos arbitrariamente largos. Por lo tanto, los siguientes comandos generarán una frase de contraseña, encriptarán el archivo usando encriptación simétrica y luego encriptarán la frase de contraseña usando la clave asimétrica (clave pública). Nota: la smime incluye el uso de una clave pública primaria y una clave de respaldo para encriptar la frase de paso. Un par de claves públicas / privadas de respaldo sería prudente.
Generación de contraseñas aleatorias
Configure el valor de RANDFILE en un archivo accesible para el usuario actual, genere el archivo passwd.txt y limpie la configuración
export OLD_RANDFILE=$RANDFILE
RANDFILE=~/rand1
openssl rand -base64 2048 > passwd.txt
rm ~/rand1
export RANDFILE=$OLD_RANDFILE
Cifrado
Utilice los siguientes comandos para encriptar el archivo usando los contenidos de passwd.txt como contraseña y AES256 a un archivo base64 (-a opción). Encripte el archivo passwd.txt usando cifrado asimétrico en el archivo XXLarge.crypt.pass usando una clave pública primaria y una clave de respaldo.
openssl enc -aes-256-cbc -a -salt -in XXLarge.data -out XXLarge.crypt -pass file:passwd.txt
openssl smime -encrypt -binary -in passwd.txt -out XXLarge.crypt.pass -aes256 PublicKey1.pem PublicBackupKey.pem
rm passwd.txt
Descifrado
El descifrado simplemente descifra el archivo XXLarge.crypt.pass para passwd.tmp, descifra XXLarge.crypt a XXLarge2.data y elimina el archivo passwd.tmp.
openssl smime -decrypt -binary -in XXLarge.crypt.pass -out passwd.tmp -aes256 -recip PublicKey1.pem -inkey PublicKey1.key
openssl enc -d -aes-256-cbc -a -in XXLarge.crypt -out XXLarge2.data -pass file:passwd.tmp
rm passwd.tmp
Esto ha sido probado contra archivos de> 5GB.
5365295400 Nov 17 10:07 XXLarge.data
7265504220 Nov 17 10:03 XXLarge.crypt
5673 Nov 17 10:03 XXLarge.crypt.pass
5365295400 Nov 17 10:07 XXLarge2.data
Para cifrar de forma segura archivos de gran tamaño (> 600 MB) con openssl smime
, deberá dividir cada archivo en pequeños fragmentos:
# Splits large file into 500MB pieces
split -b 500M -d -a 4 INPUT_FILE_NAME input.part.
# Encrypts each piece
find -maxdepth 1 -type f -name ''input.part.*'' | sort | xargs -I % openssl smime -encrypt -binary -aes-256-cbc -in % -out %.enc -outform DER PUBLIC_PEM_FILE
Por el bien de la información, aquí está cómo descifrar y unir todas las piezas:
# Decrypts each piece
find -maxdepth 1 -type f -name ''input.part.*.enc'' | sort | xargs -I % openssl smime -decrypt -in % -binary -inform DEM -inkey PRIVATE_PEM_FILE -out %.dec
# Puts all together again
find -maxdepth 1 -type f -name ''input.part.*.dec'' | sort | xargs cat > RESTORED_FILE_NAME
Public-key crypto no es para cifrar archivos arbitrariamente largos. Uno usa un cifrado simétrico (por ejemplo, AES) para hacer el cifrado normal. Cada vez que se genera, utiliza y luego se cifra una nueva clave simétrica aleatoria con el cifrado RSA (clave pública). El texto cifrado junto con la clave simétrica encriptada se transfiere al destinatario. El destinatario descifra la clave simétrica con su clave privada, y luego usa la clave simétrica para descifrar el mensaje.
La clave privada nunca se comparte, solo la clave pública se usa para encriptar el cifrado simétrico aleatorio.
Solución para codificar seguro y de alta seguridad cualquier archivo en OpenSSL y línea de comandos:
Debería haber preparado algún certificado X.509 para encriptar archivos en formato PEM.
Cifrar archivo
openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem
Que es que:
- comando smime -ssl para la utilidad S / MIME ( smime(1) )
- -encrypt - método elegido para el proceso de archivo
- -binary : utiliza un proceso de archivo seguro. Normalmente, el mensaje de entrada se convierte al formato "canónico" según lo requerido por la especificación S / MIME, este interruptor lo deshabilita. Es necesario para todos los archivos binarios (como imágenes, sonidos, archivos ZIP).
- -aes-256-cbc - cifrado elegido AES en 256 bits para encriptación (fuerte). Si no se especifica, se usa RC2 de 40 bits (muy débil). ( Cifrados admitidos )
- -in plainfile.zip - nombre del archivo de entrada
- -out encrypted.zip.enc - nombre del archivo de salida
- -outform DER : codifica el archivo de salida como binario. Si no se especifica, el archivo está codificado por base64 y el tamaño del archivo se incrementará en un 30%.
- yourSslCertificate.pem - nombre de archivo de su certificado. Eso debería estar en formato PEM.
Ese comando puede encriptar fuertemente grandes archivos independientemente de su formato.
Problema conocido: algo malo sucede cuando intentas encriptar un archivo enorme (> 600MB). No se arrojó ningún error, pero el archivo encriptado estará dañado. Siempre verifica cada archivo! (o use PGP, que es más compatible con cifrado de archivos con clave pública)
Descifrar archivo:
openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password
Que es que:
- -inform DER -igual que -forma anterior
- -inkey private.key - nombre de archivo de su clave privada. Eso debe estar en formato PEM y puede encriptarse por contraseña.
- -passin pass: tu_contraseña - tu contraseña para clave privada encripta. ( argumentos de frase de contraseña )
Tal vez debería verificar la respuesta aceptada a esta pregunta ( ¿Cómo cifrar datos en php usando claves públicas / privadas? ).
En lugar de trabajar manualmente en torno a la limitación del tamaño del mensaje (o quizás un rasgo) de RSA, muestra cómo usar la característica S / mime de OpenSSL para hacer lo mismo y no tener que hacer malabarismos con la clave simétrica de forma manual.