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

## 説明

### RSA暗号について

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

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

- 公開鍵暗号である。
- 暗号化・復号処理は非常に低速である。

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

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

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

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

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

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

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

鍵は公開鍵・秘密鍵共にDER形式のものを使用します。鍵形式は以下のようにして下さい。

1. 鍵のデータフォーマットがASN.1形式に準拠しており、DERエンコードされている
2. 使用している公開鍵の公開指数が65537である

なお鍵長に制限はありませんが、動作確認を取っているのは1024・2048・4096bitです。

暗号化文字列は以下の形式になっています。

1. RSA暗号にて暗号化
2. PKCS#1 v1.5形式でパディング

暗号化可能な文字列の長さは鍵長よりも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 の中身が一致していたら鍵は正しく動作することが確認できます。

## 参照

`CRYPTO関数一覧
`

## 履歴

2008/10/30 暗号化文字列のフォーマットに関する修正
2008/10/02 鍵のフォーマットに関する修正
2008/09/18 HTMLタグ周りの修正
2008/09/16 記載の一部修正
2008/03/27 初版