RSAとOpenSSLでメッセージ/テキストを暗号化する方法は?


29

アリスの公開鍵を持っています。アリスにRSA暗号化メッセージを送信したい。opensslコマンドを使用してどうすればよいですか?

メッセージは次のとおりです。

こんにちはアリス!夕食にはmalacpörköltを持参してください!

回答:


36

ではOpenSSLのマニュアルopensslmanページ)を検索RSAし、あなたは、RSA暗号化のためのコマンドがあることがわかりますrsautl。次に、rsautlmanページを読んで構文を確認します。

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

デフォルトのパディング方式は、元のPKCS#1 v1.5(多くのプロコトールで使用されています)です。opensslは、OAEP(現在推奨)およびraw暗号化(特別な状況でのみ有用)もサポートしています。

opensslを直接使用することは、ほとんどが演習であることに注意してください。実際には、gpgなどのツールを使用します(RSAを使用しますが、メッセージを直接暗号化するわけではありません)。


使用の問題は何opensslですか?
ブラッチリー

2
@Bratchley opensslコマンドラインツールは、異なるコマンドが混在しています。証明書を操作するもののほとんどは有用ですが、構文とパラメーターが風変わりであるため、正しく使用するのは困難です。などrsautlは問題ありませんが、有用な機能を提供せず、生の暗号化プリミティブを公開するだけです。たとえば、RSA暗号化は、ハイブリッド暗号化の対称キーの暗号化にのみ使用されます。などの一部は、enc安全に使用するのが非常に難しく、それらが存在しなければ世界はより良くなるでしょう。
ジル「SO-悪であるのをやめる」

素晴らしい答え。このフラグを使用してパディングを追加しました-oaepその後、復号化時に同じものを指定します... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

最初に、適切な暗号化が必要な場合は、GnuPGをご覧ください。しかし、実験して、それがどのように機能するかを学びたいだけなら、RSAが何であるかを理解する必要があります。RSAは任意の文字列を暗号化するようには設計されていません。整数を暗号化するアルゴリズムです。具体的には、0〜n-1の整数。nは公開キーのモジュラス値です。1024ビットのRSAキーについて説明すると、モジュラスをバイナリで保存するには1024ビットが必要です。これが理由の1つです。RSAは、DESAESのような対称キー暗号と組み合わせて使用​​されます。AES用にランダムな256ビットキーを生成し、1024ビットRSA公開キーでそのキーを暗号化できます。その後、秘密鍵にアクセスする誰でも対称鍵を抽出し、AESでメッセージをデコードできます。RSAの完全な標準はPKCS#1と呼ばれます

さらに、DESとAESはブロック暗号です。特定のサイズのブロック内のデータのみを暗号化します。DESは64ビットブロックを使用し、AESは128ビットブロックを使用します。複数のブロックを暗号化するには、CBCやCTRなどの動作モードを使用する必要があります。これらのモードは、ブロックモード暗号を使用してビットストリームを暗号化する方法を指定します。

最後に、受信したデータを確認することが重要です。攻撃者は転送中のデータを読み取ることができない場合がありますが、データストリームに整合性または信頼性が適用されていない場合、検出せずにビットを反転させることができます。攻撃者は、ポート443へのSSL接続がおそらくWebページのリクエストであるGET /と簡単に推測できPUT /、暗号化の残りの部分を妨げることなくビットを変更することができます。整合性への簡単なアプローチは、最後にMD5またはSHA-1の合計を追加することですが、それはデータの信頼性ではなく、データの整合性のみを提供します。データストリームの完全な知識を持っている人は正しい合計を生成できます。より安全なアプローチは、HMACのようなキー付きハッシュを使用することです 生成するには秘密鍵の知識が必要です。これにより、整合性に加えてデータの信頼性が提供されます。


2
これは本当に良いです
mko

5

以下では、リストされているアルゴリズムでもRSAでも、必要なアルゴリズムを指定できることに注意してください(OpenSSLがRSAに使用する正確な名前はわかりません)

「openssl enc -help」を使用して、システムでサポートされている暗号のリストを取得し、それを引数として渡します。たとえば、「-aes256」

私のシステムでは、オプションにRSAがないことに注意してください-少なくともその名前では。


S / MIMEメッセージを暗号化するにはどうすればよいですか?

誰かがあなたに彼女の公開証明書を送信し、彼女へのメッセージを暗号化するように頼んだとしましょう。彼女の証明書をher-cert.pemとして保存しました。返信をmy-message.txtとして保存しました。

デフォルトの(かなり弱いものの)RC2-40暗号化を取得するには、メッセージと証明書の場所をopensslに伝えます。

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

リモートコルレスに堅牢なSSLツールキットがあることを確信している場合は、Triple DESのような強力な暗号化アルゴリズムを指定できます。

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

デフォルトでは、メールヘッダーを含む暗号化されたメッセージは標準出力に送信されます。-outオプションまたはシェルを使用して、ファイルにリダイレクトします。または、はるかに複雑な出力をsendmailに直接パイプします。

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My encrypted reply' |\
 sendmail her@heraddress.com

S / MIMEメッセージに署名するにはどうすればよいですか?

メッセージ全体を暗号化する必要はないが、受信者にメッセージの整合性を保証できるように署名する場合、レシピは暗号化の場合と同様です。主な違いは、受信者の証明書では何も署名できないため、独自のキーと証明書が必要なことです。

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My signed reply' |\
 sendmail her@heraddress.com

http://www.madboa.com/geek/openssl/から)

(...これらのすべてのバックスラッシュ-エスケープされた改行であるはずです。ここの編集ボックスに問題なく表示されるため、何が起こっているのかわかりません!


1
改行を保持するには、各行の先頭に4つのスペースを入れる必要があります。最初のブロックを変更して、方法を説明しました。2番目を修正できますか?
ミケル

1
対称暗号化専用であるopenssl encため、RSAは見つかりませんencでした。ええ、opensslのオプションはあまり整理されていません。非対称アルゴリズムは、独自のコマンドを持っている:rsa/ dsa/ dhキーを操作するために、rsautl/ dsautlに暗号化/復号化/検証/記号、およびgenrsa/ gendsa/ gendhキーを生成します。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.