Wie verschlüssle ich Nachrichten / Text mit RSA & OpenSSL?

29

Ich habe Alices öffentlichen Schlüssel. Ich möchte Alice eine RSA-verschlüsselte Nachricht senden. Wie kann ich das mit dem opensslBefehl machen?

Die Nachricht lautet:

Hallo Alice! Bitte bringen Sie malacpörkölt zum Abendessen mit!

LanceBaynes
quelle

Antworten:

36

Suchen Sie im openssl-Handbuch ( opensslManpage) nach RSAund Sie werden sehen, dass der Befehl für die RSA-Verschlüsselung lautet rsautl. Lesen Sie dann die rsautlManpage , um die Syntax zu sehen.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

Das Standard- Auffüllschema ist das ursprüngliche PKCS # 1 v1.5 (wird immer noch in vielen Prokotolen verwendet). openssl unterstützt auch OAEP (jetzt empfohlen) und Raw-Verschlüsselung (nur unter besonderen Umständen nützlich).

Beachten Sie, dass die direkte Verwendung von openssl meist eine Übung ist. In der Praxis würden Sie ein Tool wie gpg verwenden (das RSA verwendet, die Nachricht jedoch nicht direkt verschlüsselt).

Gilles 'SO - hör auf böse zu sein'
quelle
Was ist das Problem bei der Verwendung openssl?
Bratchley
2
@Bratchley Das opensslBefehlszeilentool ist eine Mischung aus verschiedenen Befehlen. Einige, vor allem solche, die Zertifikate manipulieren, können nützlich sein, sind jedoch schwer korrekt zu verwenden, da ihre Syntax und Parameter eigenartig sind. Einige davon rsautlsind zwar in Ordnung, bieten jedoch keine nützliche Funktionalität, sondern stellen lediglich unformatierte kryptografische Grundelemente zur Verfügung. Beispielsweise wird die RSA-Verschlüsselung so gut wie nur zum Verschlüsseln eines symmetrischen Schlüssels für die Hybridverschlüsselung verwendet. Manche encsind sehr schwer sicher zu benutzen und die Welt wäre besser dran, wenn es sie nicht gäbe.
Gilles 'SO- hör auf böse zu sein'
Gute Antwort. Ich fügte das Auffüllen mit diesem Flag hinzu -oaep Dann beim Entschlüsseln das gleiche angeben ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet
24

Wenn Sie nur eine gute Verschlüsselung wünschen, sollten Sie sich zunächst GnuPG ansehen . Aber wenn Sie experimentieren und nur lernen möchten, wie es funktioniert, müssen Sie verstehen, was RSA ist. RSA ist nicht zum Verschlüsseln einer beliebigen Zeichenfolge ausgelegt, sondern ein Algorithmus, der eine ganze Zahl verschlüsselt. Insbesondere eine Ganzzahl von 0 bis n-1, wobei n der Modulwert aus dem öffentlichen Schlüssel ist. Wenn Sie von einem RSA-Schlüssel mit 1024 Bit sprechen, bedeutet dies, dass 1024 Bit erforderlich sind, um den Modul binär zu speichern. Dies ist einer der Gründe, warum RSA in Kombination mit einer symmetrischen Schlüsselchiffre wie DES oder AES verwendet wird. Sie können einen zufälligen 256-Bit-Schlüssel für AES generieren und diesen Schlüssel mit einem öffentlichen 1024-Bit-RSA-Schlüssel verschlüsseln. Dann kann jeder, der auf den privaten Schlüssel zugreift, den symmetrischen Schlüssel extrahieren und die Nachricht mit AES decodieren. Der vollständige Standard für RSA heißt PKCS # 1

Außerdem sind DES und AES Blockchiffren. Sie verschlüsseln nur Daten in Blöcken einer bestimmten Größe. DES verwendet 64-Bit-Blöcke und AES 128-Bit-Blöcke. Um mehr als einen Block zu verschlüsseln, müssen Sie einen Betriebsmodus wie CBC oder CTR verwenden. Diese Modi geben an, wie ein Bitstrom mit einer Blockmodus-Verschlüsselung verschlüsselt wird.

Zuletzt ist es wichtig, die empfangenen Daten zu überprüfen. Während ein Angreifer möglicherweise nicht in der Lage ist, Daten während der Übertragung zu lesen, kann er möglicherweise Bits ohne Erkennung spiegeln, wenn keine Integrität oder Authentizität auf den Datenstrom angewendet wird. Ein Angreifer kann leicht erraten, dass es sich bei einer SSL-Verbindung zu Port 443 wahrscheinlich um eine Webseitenanforderung handelt, die mit beginnt, GET /und er könnte die Bitänderung in umkehren, PUT /ohne den Rest der Verschlüsselung zu beeinträchtigen. Ein einfacher Ansatz für die Integrität besteht darin, am Ende eine MD5- oder SHA-1-Summe anzuhängen, die jedoch nur Datenintegrität und nicht Datenauthentizität bietet. Jeder, der den Datenstrom vollständig kennt, kann eine korrekte Summe generieren. Ein sichererer Ansatz ist die Verwendung eines verschlüsselten Hashs wie HMAC Dies erfordert die Kenntnis eines geheimen Schlüssels, um Datenauthentizität und -integrität zu erzeugen.

penguin359
quelle
2
Das ist wirklich gut
mko
5

Beachten Sie, dass Sie im Folgenden angeben können, welchen Algorithmus Sie möchten, seien es die aufgelisteten oder RSA (obwohl mir der genaue Name für RSA von OpenSSL nicht bekannt ist).

Verwenden Sie "openssl enc -help", um eine Liste der unterstützten Chiffren auf Ihrem System abzurufen, und übergeben Sie diese als Argument. zB -aes256

Hinweis auf meinem System Ich habe keine RSA in meinen Optionen - zumindest mit diesem Namen.


Wie verschlüssele ich eine S / MIME-Nachricht?

Angenommen, jemand sendet Ihnen sein öffentliches Zertifikat und bittet Sie, eine Nachricht an sie zu verschlüsseln. Sie haben ihr Zertifikat als her-cert.pem gespeichert. Sie haben Ihre Antwort als my-message.txt gespeichert.

Um die Standard-RC2-40-Verschlüsselung zu erhalten, müssen Sie nur openssl mitteilen, wo sich die Nachricht und das Zertifikat befinden.

openssl smime her-cert.pem -encrypt -in my-message.txt

Wenn Sie sich ziemlich sicher sind, dass Ihr Remote-Korrespondent über ein robustes SSL-Toolkit verfügt, können Sie einen stärkeren Verschlüsselungsalgorithmus wie Triple DES angeben:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

Standardmäßig wird die verschlüsselte Nachricht einschließlich der E-Mail-Header an die Standardausgabe gesendet. Verwenden Sie die Option -out oder Ihre Shell, um sie in eine Datei umzuleiten. Oder, viel schwieriger, leiten Sie die Ausgabe direkt an sendmail weiter.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

Wie signiere ich eine S / MIME-Nachricht?

Wenn Sie nicht die gesamte Nachricht verschlüsseln müssen, sie jedoch signieren möchten, damit Ihr Empfänger von der Integrität der Nachricht überzeugt ist, ähnelt das Rezept dem für die Verschlüsselung. Der Hauptunterschied besteht darin, dass Sie einen eigenen Schlüssel und ein eigenes Zertifikat benötigen, da Sie mit dem Zertifikat des Empfängers nichts signieren können.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(von http://www.madboa.com/geek/openssl/ )

(ähm ... all diese Backslashes - das sollen Zeilenumbrüche sein. Ich bin mir nicht sicher, was los ist, da es hier in meinem Bearbeitungsfeld gut angezeigt wird!

draeath
quelle
1
Sie müssen vier Leerzeichen am Anfang jeder Zeile einfügen, um die Zeilenumbrüche beizubehalten. Ich habe den ersten Block geändert, um Ihnen zu zeigen, wie. Können Sie das zweite Problem beheben?
Mikel
1
Sie haben RSA nicht gefunden, openssl encda ences nur für die symmetrische Verschlüsselung vorgesehen ist. Ja, die Optionen von openssl sind nicht sehr gut organisiert. Asymmetrisches Algorithmen haben ihre eigenen Befehle: rsa/ dsa/ dhauf Tasten zu manipulieren, rsautl/ dsautlzum Verschlüsseln / Entschlüsseln / Verifizieren / Zeichen und genrsa/ gendsa/ gendhum Schlüssel zu erzeugen.
Gilles 'SO- hör auf böse zu sein'