publica privada gpg generar encriptar desencriptar descifrar con como comando clave cifrado asimetrico archivos linux openssl

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 persona

La 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:

  1. Genera una clave usando openssl rand , ej. openssl rand 32 -out keyfile
  2. Encriptar el archivo de clave usando openssl rsautl
  3. Cifre los datos usando openssl enc , usando la clave generada desde el paso 1.
  4. 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.