RSA アルゴリズムによる暗号化 (overview)

説明

RSA暗号について

RSA アルゴリズムによる暗号化関数は公開鍵を用いた暗号を行うために用意しています。

RSA アルゴリズムには以下の特徴があります。

公開鍵暗号方式は共通鍵暗号方式に比して鍵の配送に関するリスクが低いというメリットがありますが、 他の暗号方式と比較して処理速度が遅いというデメリットがあります。 そのため暗号化したいデータは他の暗号方式で暗号化し、 その暗号化に用いた鍵をRSAで暗号化して配送するという方法を採るのが一般的です。

RSA暗号を使うときの注意事項

RSA暗号方式の性質として以下のようなものがあります。

  1. 秘密鍵が流出すれば暗号が危殆化する
  2. Private Exponentが判明できれば復号ができる(ブルートフォース攻撃)
  3. 鍵配送を悪用すればデータの偽装が可能(main-in-the-middle攻撃)

秘密鍵が流出すると暗号解読も署名偽装も可能となり暗号による安全性は損なわれます。秘密鍵の管理には十分注意してください。
ブルートフォース攻撃に対しては鍵長を長くすれば防ぎやすくなりますが、その分暗号化のための処理速度が増大します。
main-in-the-middleを防ぐためには公開鍵の認証(証明書)が有効です。

詳細は、一般的な暗号の書籍を参照してください。

鍵形式および暗号/復号文字列について

鍵は公開鍵・秘密鍵共にDER形式のものを使用します。鍵長に制限はありません。
暗号化文字列は鍵長よりも短いものである必要があります。(例えば1024bitの鍵長の場合は暗号化する文字列は1024bit未満である必要があります) 復号文字列はCRYPTOライブラリで暗号化したもの以外を用いる場合は以下の条件を全て満たすものを用います

  1. PKCS#1に準拠している
  2. 使用している公開鍵の公開指数が65537である

制限事項

ありません。

鍵作成例

一例として、オープンソースのSSL ツールキットであるOpenSSLで暗号化に用いる公開・秘密鍵を作成する手順を以下に述べます。

1. RSA 秘密鍵を作成する

OpenSSLがインストールされている環境のコマンドラインで以下のコマンドを入力することで、PEM形式・鍵長 1024 bit の RSA 秘密鍵ファイル privkey.pem を作成します。

 > openssl genrsa -out privkey.pem

万が一、privkey.pem が漏洩すると、誰もが暗号解読および暗号偽造ができるようになってしまいます。 秘密鍵の鍵ファイルは厳重に取り扱うようにしてください。

PEM形式の秘密鍵ができたらDER形式に変換します。

 > openssl rsa -outform DER -in privkey.pem -out privkey.der

CRYPTO APIで秘密鍵を指定するときは、この privkey.der の中身をC言語の u8 の配列に変換して指定します。 なお、privkey.der も秘密鍵のため privkey.pem 同様厳重に取り扱うようにしてください。

2. RSA 公開鍵を作成する

以下のコマンドでDER形式の公開鍵を作成します。

 > openssl rsa -pubout -inform DER -in privkey.der -outform DER -out pubkey.der

CRYPTO APIで公開鍵を指定するときは、この pubkey.der の中身をC言語の u8 の配列に変換して指定します。

3. 鍵の動作確認をする

作成した秘密・公開鍵のペアが正しく機能するかを確認します。
まず、鍵長のよりも短い文字列長の文字列を記載したテキストファイル (test.txt) を用意し、公開鍵で暗号化して test.txt.enc に変換します。

 > openssl rsautl -encrypt -in test.txt -out test.txt.enc -pubin -keyform DER -inkey pubkey.der

作成した秘密・公開鍵のペアが正しく機能するかを確認します。
次に、test.txt.enc を秘密鍵で復号して test.txt.dec に変換します。

 > openssl rsautl -decrypt -in test.txt.enc -out test.txt.dec -keyform DER -inkey privkey.der

test.txt と test.txt.dec の中身が一致していたら鍵は正しく動作することが確認できます。

参照

CRYPTO関数一覧

履歴

2008/03/27 初版