====== einzelne Dateien mit openSSL verschlüsseln ====== * [[::OpenSSL]] * [[::OpenSSL-Verschlüsselung von Zeichenketten]] * [[https://wiki.openssl.org/index.php/Enc]] * [[http://wiki.ubuntuusers.de/Daten_verschlüsseln#OpenSSL]] * [[http://cb.vu/unixtoolbox_pt.xhtml#crypt]] Die Stärke der Sicherheit der drei besten Cipher/[[::Verschlüsselungsarten]] ist wie folgt, der sicherste steht oben: - **serpent** //(der sicherste in ''[[Verschlüsselung mit CryptSetup|CryptSetup]]'' - ganzes Dateisystem verschlüsseln)// - **twofish** //(der sicherste in ''[[::einzelne Dateien mit GPG verschlüsseln|GPG]]'' - einzelne Dateie verschlüsseln) -> [[::GPG-Verschlüsselung mit Passwort]]// - **blowfish** //(der sicherste in ''[[::einzelne Dateien mit openSSL verschlüsseln|openSSL]]'' - einzelne Dateie und Zeichenketten verschlüsseln) **-> [[::OpenSSL-Verschlüsselung mit Passwort]] -> [[::OpenSSL-Verschlüsselung von Zeichenketten]]**// **//Leider musste ich Anfang des Jahres 2024 (mit FreeBSD 14.0) feststellen, dass OpenSSL die hier genannten Beispiele mit BlowFish (''bf-cbc'') nicht mehr ausführt. Um diese Kommandos weiterhin ausführen zu können, muß man stattdessen den schwächeren AES (''aes-256-cbc'') verwenden.//** __Alle Cipher, die von dem Kommando__ **''openssl list -cipher-commands''** __ausgegeben werden, können für die hier genannten Beispiel verwendet werden.__ __Bei symetrischer Verschlüsselung (z.B. nur mit Passwort), sollte immer die Option ''-salt'' verwendet werden!__ ===== Symetrische Verschlüsselung (mit Passwort) ===== **[[https://www.shellhacks.com/encrypt-decrypt-file-password-openssl/|The -salt option should ALWAYS be used if the key is being derived from a password.]]** [[::OpenSSL-Verschlüsselung mit Passwort]] ==== Zeichenkette symetrisch verschlüsseln ==== eine Datei mit geheimem Inhalt anlegen: > touch geheim.txt > chmod 0600 geheim.txt > echo "Das ist ein geheimer Text" > geheim.txt den geheimen Dateiinhalt verschlüsseln: > cat geheim.txt | openssl enc -salt -iter 1234567 -aes-256-cbc -a -e > geheim.ssl enter bf-cbc encryption password: Verifying - enter bf-cbc encryption password: > rm -f geheim.txt > cat geheim.ssl U2FsdGVkX19JcdCWBa4sGZAkeDeFrsRlWnvl85lBQ+LXTToAwJLFuiF458LkLS7t das Geheimnis wieder sichtbar machen: > cat geheim.ssl | openssl enc -salt -iter 1234567 -aes-256-cbc -a -d enter bf-cbc decryption password: Das ist ein geheimer Text ==== Dateien symetrisch verschlüsseln ==== === Datei mit OpenSSL auf der CLI verschlüsseln === Datei verschlüsseln (AES): > echo "ganz geheimer Text" > datei.txt > openssl enc -a -salt -iter 1234567 -aes-256-cbc -e -in datei.txt -out datei.aes oder > openssl enc -a -salt -iter 1234567 -aes-256-cbc -e -in datei.txt > datei.aes Datei wieder entschlüsseln (AES): > openssl enc -a -salt -iter 1234567 -aes-256-cbc -d -in datei.aes -out datei2.txt oder > cat datei.aes | openssl enc -a -salt -iter 1234567 -aes-256-cbc -d > datei2.txt einen ganzen Verzeichnisbaum verschlüsseln (AES): > tar -cf - /Verzeichnis | openssl enc -salt -iter 1234567 -aes-256-cbc -e -out verzeichnis.tar.aes oder > tar -cf - /Verzeichnis | openssl enc -salt -iter 1234567 -aes-256-cbc -e > verzeichnis.tar.aes und wieder entschlüsseln (AES): > openssl enc -salt -iter 1234567 -aes-256-cbc -d -in verzeichnis.tar.aes | tar -x -f - oder > cat verzeichnis.tar.aes | openssl enc -salt -iter 1234567 -aes-256-cbc -d | tar -x -f - Datei verschlüsseln (mit BF und ohne Passwrtabfrage): > openssl enc -a -salt -iter 1234567 -bf-cbc -md sha512 -k "geheimes Passwort" -e -in datei.txt -out datei.ssl enter bf-cbc encryption password: Verifying - enter bf-cbc encryption password: Datei verschlüsseln (mit BF und ohne Passwrtabfrage): > openssl enc -a -salt -iter 1234567 -bf-cbc -md sha512 -k "geheimes Passwort" -d -in datei.ssl oder > cat datei.ssl | openssl enc -a -salt -iter 1234567 -bf-cbc -md sha512 -k "geheimes Passwort" -d === Datei mit OpenSSL per Skript verschlüsseln === Die Datei ''/tmp/datei'' verschlüsseln (lesbare Textdatei erzeugen): ~/bin/Datei_verschluesseln.sh -w 1234567 -m bf -t -d /tmp/datei enter bf-cbc encryption password: Verifying - enter bf-cbc encryption password: -rw-r--r-- 1 fritz wheel 33B 4 Okt. 17:43 /tmp/datei.ssl Die Datei ''/tmp/datei.ssl'' (lesbare Textdatei) entschlüsseln: ~/bin/Datei_verschluesseln.sh -w 1234567 -m bf -t -d /tmp/datei.ssl enter bf-cbc decryption password: -rw-r--r-- 1 fritz wheel 6B 4 Okt. 17:43 /tmp/datei #!/usr/bin/env bash #------------------------------------------------------------------------------# # # Dieses Skript erstellt eine verschlüsselte Kopie einer Datei. # # openssl enc -a -salt -iter 1234567 -bf-cbc -e # openssl enc -a -salt -iter 1234567 -bf-cbc -d # #------------------------------------------------------------------------------# #VERSION="v2020100400" # erste Version VERSION="v2020101000" # es kann jetzt auch ein Zielverzeichnis angegeben werden AVERZ="$(dirname ${0})" # Arbeitsverzeichnis, hier liegen diese Dateien #==============================================================================# if [ "x${1}" = x ] ; then ${0} -h exit 10 fi while [ "${#}" -ne "0" ]; do case "${1}" in -w) WIEDERHOLUNGEN="${2}" # es sollten mehr als 1 Mio. mal wiederholt werden shift ;; -m) METHODE="-${2}" # BlowFish als Ersatz für Serpent shift ;; -t) ASCII="-a" # nicht in der platzsparenden Binärform, sondern in Text-Form shift ;; -d) DATEI="${2}" # Dateiname shift ;; -z) ZIEL="${2}" # Zielverzeichnis shift ;; -p) PASSWORT="-pass pass:${2}" # Passwort shift ;; -h) # ausgabe_hilfe echo "HILFE: # die Reihenfolge der Optionen ist unwichtig # Anzahl der Wiederholungen, es sollten mehr als 1 Mio. sein -w 1234567 # Verschlüsselungsmethode, da OpenSSL kein Serpent kann, empfehle ich BlowFish -m bf # nicht in Binärform, sondern in Textform # wenn diese Option nicht angegeben wird, dann wird eine platzsparende Datei mit Binärinhalt erzeugt -t # Datei mit zu verschlüsselndem Inhalt -d geheim.txt # Datei mit zu entschlüsselndem Inhalt -d geheim.txt.ssl # allgemeine Form ${0} -w [Wiederholungen] -m [Verschlüsselungsmethode] [in Binärform oder Textform] -d [verschlüsseln oder entschlüsseln] # verschlüsseln einer Datei, in der platzsparenden Binärform ${0} -w 1234567 -m bf -d geheim.txt # entschlüsseln einer Datei ${0} -w 1234567 -m bf -d geheim.txt.ssl # verschlüsseln einer Datei, in sichtbarer Textform (-t) # das ist geeignet für E-Mails oder zum abschreiben ${0} -w 1234567 -m bf -t -d geheim.txt # entschlüsseln einer Datei, die in Textform (ASCII) vorliegt (-t) ${0} -w 1234567 -m bf -t -d geheim.txt.ssl # das Passwort kann auch (für automatische Abarbeitungen) direkt übergeben werden ${0} -w 1234567 -m bf -d geheim.txt -p 'geheimes Passwort' " exit 20 ;; *) if [ "$(echo "${1}"|egrep '^-')" ] ; then echo "Der Parameter '${1}' wird nicht unterstützt!" export STOP="Ja" fi shift ;; esac done #==============================================================================# ### Kontrolle if [ -e "${DATEI}" ] ; then ls -lha ${DATEI} else echo "Es konnte die Datei '${DATEI}' nicht gefunden werden. Abbruch!" exit 30 fi if [ "x${WIEDERHOLUNGEN}" = x ] ; then WIEDERHOLUNGEN="4567890" fi if [ "x${METHODE}" = x ] ; then METHODE="bf" fi V_NAME="$(dirname "${DATEI}")" if [ "x${ZIEL}" = x ] ; then ABS="$(echo "${DATEI}" | egrep '^[/]')" if [ "x${ABS}" = x ] ; then ZIEL="." fi fi #==============================================================================# ### Programm PROGRAMM="$(which openssl)" if [ "x${PROGRAMM}" = "x" ] ; then echo "Es konnte das Programm 'openssl' nicht gefunden werden. Abbruch!" exit 40 fi #==============================================================================# ENDUNG="$(echo "${DATEI}" | rev | awk '{sub("[.]"," "); print tolower($1)}' | rev)" #echo "ENDUNG='${ENDUNG}'" if [ "${ENDUNG}" = "ssl" ] ; then D_NAME="$(basename "${DATEI}" | rev | awk '{sub("[.]"," "); print $2}' | rev)" echo "#=> ${ZIEL}/${V_NAME}/${D_NAME}" if [ -e "${ZIEL}/${V_NAME}/${D_NAME}" ] ; then echo "Die Datei mit dem Namen '${D_NAME}' existiert schon." else mkdir -p "${ZIEL}/${V_NAME}/" touch "${ZIEL}/${V_NAME}/${D_NAME}" chmod 0600 "${ZIEL}/${V_NAME}/${D_NAME}" cat ${DATEI} | openssl enc -salt -iter ${WIEDERHOLUNGEN} ${METHODE} ${ASCII} ${PASSWORT} -d > "${ZIEL}/${V_NAME}/${D_NAME}" ls -lha "${ZIEL}/${V_NAME}/${D_NAME}" fi else echo "#=> ${ZIEL}/${V_NAME}/${DATEI}".ssl if [ -e "${ZIEL}/${V_NAME}/${DATEI}.ssl" ] ; then echo "Die Datei mit dem Namen '${DATEI}.ssl' existiert schon." else mkdir -p "${ZIEL}/${V_NAME}/" touch "${ZIEL}/${V_NAME}/${DATEI}".ssl chmod 0600 "${ZIEL}/${V_NAME}/${DATEI}".ssl cat ${DATEI} | openssl enc -salt -iter ${WIEDERHOLUNGEN} ${METHODE} ${ASCII} ${PASSWORT} -e > "${ZIEL}/${V_NAME}/${DATEI}".ssl ls -lha "${ZIEL}/${V_NAME}/${DATEI}".ssl fi fi ===== Asymetrische Verschlüsselung (mit SSL-Schlüssel) ===== ==== mit RSA-Schlüssel ==== Große Dateien können nicht asymetrisch verschlüsselt werden! => [[https://stackoverflow.com/questions/7143514/how-to-encrypt-a-large-file-in-openssl-using-public-key|How to encrypt a large file in openssl using public key]] Die übliche Vorgehensweise, für das verschlüsseln von langen Dateien sieht wie folgt aus: Große Dateien werden jedes Mal mit einem neuen zufällig generierten, symmetrischen Schlüssel Verschlüsselt. Der dazu verwendete symmetrische Schlüssel wird mit dem öffentlichen RSA-Schlüssel verschlüsselt. Dann wird der Chiffre-Text zusammen mit dem verschlüsselten symmetrischen Schlüssel an den Empfänger übertragen. Der Empfänger entschlüsselt den symmetrischen Schlüssel mit seinem privaten Schlüssel und verwendet dann den symmetrischen Schlüssel zum Entschlüsseln der Nachricht (Chiffre-Text). Datei verschlüsseln: > echo "ganz geheimer Text" > datei.txt > openssl pkeyutl -encrypt -inkey cert.pem -certin -in datei.txt -out datei.ssl oder > openssl pkeyutl -encrypt -inkey public.pem -pubin -in datei.txt -out datei.ssl Datei entschlüsseln: > openssl pkeyutl -decrypt -inkey private.pem -in datei.ssl -out datei.txt __Manchmal gibt es Probleme (meist beim entschlüsseln), wenn bestimmte Zeichen in der Datei vorkommen. In soeinem Fall ist es hilfreich, die zu verschlüsselnden Dateien vorher in Base64-Kode umzuwandeln.__ > base64 Datei.txt > Datei.txt.b64 > openssl pkeyutl -encrypt -pubin -inkey public-ssl-key.pem -in Datei.txt.b64 -out Datei.txt.b64.ssl > openssl pkeyutl -decrypt -inkey privat-ssl-key.pem -in Datei.txt.b64.ssl -out Datei.txt.b64.txt ==== S/MIME-Verschlüsselung (E-Mail-Format) ==== jetzt schreiben wir einen kurzen Text, an dem wir die Verschlüsselung+Entschlüsselung ausprobieren: > echo "Text" > message_klartext.txt eine Zeichenkette mit einem Zertifikat verschlüsseln: > openssl smime -encrypt -aes256 -in datei.txt -out datei.ssl cert.pem die verschlüsselte Zeichenkette mit dem privaten Schlüssel entschlüsseln: > openssl smime -decrypt -inkey private.pem -in datei.ssl -out datei.txt > cat datei.txt Text ==== mit PHP ==== === verschlüsseln === > php php_openssl_verschl.php PUBLIC_KEY.pem geheim03 > verschluesselter_text.txt === entschlüsseln === > bash php_openssl_entschl.php PRIVATE_KEY.txt verschluesselter_text.txt geheim03 ===== per Web-Server/Web-Browser ===== ==== mit PHP ====
"; } else { echo "UNSECURE: This page is being access through an unsecure connection.

"; } #==============================================================================# // Create the keypair $res=openssl_pkey_new(); #echo "openssl_pkey_new:
'$res'

"; // Get private key openssl_pkey_export($res, $privatekey); // Get public key $publickey=openssl_pkey_get_details($res); $publickey=$publickey["key"]; echo "
"; echo "Private Key:
'$privatekey'

Public Key:
'$publickey'

"; #==============================================================================# echo "
"; $cleartext = '1234 5678 9012 3456'; echo "Klartext:
'$cleartext'

"; #------------------------------------------------------------------------------# ### verschluesseln openssl_public_encrypt($cleartext, $crypttext, $publickey); echo "verschluesselter Text:
'$crypttext'

"; #------------------------------------------------------------------------------# ### entschluesseln openssl_private_decrypt($crypttext, $decrypted, $privatekey); echo "entschluesselter Text:
'$decrypted'

"; echo "
"; #------------------------------------------------------------------------------# ?>