RSA アルゴリズムによる暗号化関数は公開鍵を用いた暗号を行うために用意しています。
RSA アルゴリズムには以下の特徴があります。
公開鍵暗号方式は共通鍵暗号方式に比して鍵の配送に関するリスクが低いというメリットがありますが、 他の暗号方式と比較して処理速度が遅いというデメリットがあります。 そのため暗号化したいデータは他の暗号方式で暗号化し、 その暗号化に用いた鍵をRSAで暗号化して配送するという方法を採るのが一般的です。
RSA暗号方式の性質として以下のようなものがあります。
秘密鍵が流出すると暗号解読も署名偽装も可能となり暗号による安全性は損なわれます。秘密鍵の管理には十分注意してください。
ブルートフォース攻撃に対しては鍵長を長くすれば防ぎやすくなりますが、その分暗号化のための処理速度が増大します。
main-in-the-middleを防ぐためには公開鍵の認証(証明書)が有効です。
詳細は、一般的な暗号の書籍を参照してください。
鍵は公開鍵・秘密鍵共にDER形式のものを使用します。鍵形式は以下のようにして下さい。
なお鍵長に制限はありませんが、動作確認を取っているのは1024・2048・4096bitです。
暗号化文字列は以下の形式になっています。
暗号化可能な文字列の長さは鍵長よりも11byte以上短いものである必要があります。(例えば1024bitの鍵長の場合は暗号化する文字列は117byte以下である必要があります)
CRYPTOライブラリ以外の方法で暗号化した文字列をCRYPTOライブラリで復号する場合は上記暗号化文字列形式に従ったものを使用すれば復号できます。
RSA暗号アルゴリズムはライセンスの都合上TWLでのみ動作します。NITROでは動作しません。
一例として、オープンソースの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 の中身が一致していたら鍵は正しく動作することが確認できます。
2008/10/30 暗号化文字列のフォーマットに関する修正
2008/10/02 鍵のフォーマットに関する修正
2008/09/18 HTMLタグ周りの修正
2008/09/16 記載の一部修正
2008/03/27 初版