web-dev-qa-db-ja.com

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

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

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

こんにちは、アリス!夕食にはマラポコルトを持​​参してください!

29
LanceBaynes

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

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を使用しますが、メッセージの暗号化には直接使用しません)。

まず、適切な暗号化が必要な場合は、 GnuPG を確認する必要があります。しかし、実験を行い、それがどのように機能するかを知りたいだけであれば、 [〜#〜] rsa [〜#〜] が何であるかを理解する必要があります。 RSAは任意の文字列を暗号化するようには設計されておらず、整数を暗号化するアルゴリズムです。具体的には、0からn-1までの整数。nは公開鍵のモジュラス値です。 1024ビットのRSA鍵といえば、モジュラスを2進数で格納するには1024ビットが必要です。これが理由の1つです。RSAは [〜#〜] des [〜#〜] または [〜#〜] aes [〜#のような対称鍵暗号と組み合わせて使用​​されます〜] 。 AES用のランダムな256ビットの鍵を生成し、その鍵を1024ビットのRSA公開鍵で暗号化できます。次に、秘密鍵にアクセスする誰でも対称鍵を抽出し、AESでメッセージをデコードできます。 RSAの完全な標準は PKCS#1 と呼ばれます

さらに、DESおよびAESはブロック暗号です。特定のサイズのブロックでのみデータを暗号化します。DESは64ビットブロックを使用し、AESは128ビットを使用しますブロック。ブロック以上のものを暗号化するには、CBCまたはCTRのように 操作モード を使用する必要があります。これらのモードは、ブロックモード暗号を使用してビットストリームを暗号化する方法を指定します。

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

25
penguin359

以下では、リストされているアルゴリズムまたは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ツールキットを持っていると確信している場合は、トリプル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 <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

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

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

 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]

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

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

5
draeath