RSA
暗号と署名・検証どちらにも使えるが、鍵長などから暗号で利用される場面は少なくなった。署名・検証でも代替アルゴリズムへの置き換えが進んでいる。
共通鍵の鍵暗号化の置き換え
鍵交換
署名・検証の置き換え
基本的な動作は署名RSASP1/RSAVP1、暗号 RSAEP/RSADP で同じ
暗号/復号 Section 5.1 modules 以下のサイズ 原型 (直接利用はおすすめしない)
RSAEP 公開鍵 暗号
RSADP 秘密鍵 復号
署名/検証 Section 5.2 (ハッシュ未使用) 原型 (直接利用はおすすめしない)
RSASP1 秘密鍵 署名
RSAVP1 公開鍵 検証
暗号化スキーム
RSAES-OAEP-ENCRYPT 公開鍵 暗号 RSAES-OAEP-DECRYPT 秘密鍵 復号
EME-OAEP
RSAES-PKCS1-v1_5-ENCRYPT 公開鍵 暗号 (旧?)
RSAES-PKCS1-v1_5-DECRYPT 秘密鍵 復号
EME-PKCS1-v1_5
RSASSA-PKCS1_v1_5 (旧式)
RSASSA-PSS
RFC 3447 Version 2.1
RFC 2437 Version 2.0
OAEP
RFC 2313 Version 1.5
RSAESとRSASSAのスキーム
FIPS PUB 186-5 デジタル署名標準 セクション5 では RFC 8017 RSA Version 2.2 を参照している
追加の制約あり
素数は2つに限定 (多要素は使えない)
ISO/IEC 9796-2 ? PKCSとは別の方式、 9796-3は廃止
Scheme 1 は廃止?
Scheme 2 RSA-PSS ?
Scheme 3
ANSI X9.31 ?
大きい素数を組み合わせると素因数分解が難しいことを利用した暗号手法。これと、有限の範囲の中で掛け算をくり返すと元に戻るという有限体だかガロア体だかの離散対数問題の性質を組み合わせたものかな。 現在のコンピュータ性能では2000から3000ビット程度(1000から1500ビットの素数の組み)が必要。
暗号としては共通鍵の交換に使われていたが、最新のTLSなどでは暗号用途では使われない。署名・検証用途として利用される。 基本的に4bit(16)や8bit(256) などのループを素数個にして進む方向を特殊にすると順番がわかりにくい、というだけの原理
鍵のつくりかた
素数2つを $ P =prime1 と $ Q = prime2とする。素数2つを掛け合わせたものが$ n = modulus。RSAの長さは$ nのビット長で$ Pと$ Qはその半分くらい。
$ n = P \times Q
$ e = publicExponent に素数っぽいものを決めるとprime1, prime2から秘密鍵の$ d =privateExponentまで計算できる。
素数-1と publicExponent が互いに素であること。
$ n =modulusと$ e =publicExponent が公開鍵になる。$ n =modulusと$ d =privateExponent が秘密鍵になる。
prime1と2は捨ててもいいが、計算を高速化するために秘密鍵側で保存することが一般的。
その他、秘密鍵ではprivateExponent をprime1 - 1, prime2 -1の中に収めたものなども高速化のために格納する
秘密鍵、公開鍵の組を持って暗号、署名・検証に利用できる。両方に使えるのはやや特殊。
FIPS 186-5 , IPA ASF-01 ASF-01 令和4年版で RSASSA-PKCS1_v1_5, RSASSA_PSS が署名、RSA OAEP が暗号に使用できると指定されている。 暗号・復号
RSAEP / RSADP が基本的な暗号・復号。このままでは安全ではないので暗号化スキーム(RSAESなど)を利用する。どれくらいのものを暗号化できるのかまず疑問に思うが触れられているものは少ないので何か嫌。
$ M = 平文(Message)
$ C = M^e \bmod n 暗号文
$ M = C^d \bmod n 復号
かな
暗号化できるのは基本的にmodulus 以下のサイズなので長文などには利用できない。形式的にはブロック暗号相当なので対応する長さの暗号利用モードを作ればそれっぽくもなるかも。ブロック暗号などに利用するには低速かもしれない。という前提で進めると楽。
Padding付きのまとも?な暗号がRSAESで古いRSAES-PKCS1-v1_5 と乱数を取り込んだRSAES-OAEP がある。これもサイズはmodulus より少し短いかな。
RSAEP / RSADP 単純なRSA modulus のサイズ程度まで
RSAES-PKCS1-v1_5
RSAES-OAEP 鍵長-ハッシュ長*2-2 まで
暗号前のPaddingで2バイト目、00 なら RSAEP でPADDINGなし (2バイト以上00であること)、01ならRSAES-PKCS-v1_5、02は署名のRSASSA-PKCS1_v1_5 という判断ができる、かもしれない。RSAES-OAEPやRSASSA-PSSの判定はできないかも。
RSASP1 / RSAVP1 が署名・検証。といっても中でやっている計算は暗号RSAEP / RSADPと同じ。公開鍵と秘密鍵を入れ換えているだけ。modulus以下のサイズが対象なのでハッシュなどが前提になるが、パディングなどを足さないとやや不安。
$ S = M^d \bmod n 署名
$ M = S^e \bmod n 検証
かもしれない
長文にも対応できるのがRSASSAの署名・検証スキーム。共通鍵暗号ではMACが同じ機能 RSASSA-PKCS1_v1_5 乱数未使用
RSASSA-PSS 乱数使用
古い方のRSASSA-PKCS1_v1_5 と 新しいRSASSA-PSS がある。
JWSなどではRSASSA-PKCS1-v1_5が推奨でよく使われている。RSASSA-PSSもオプションで使える。
1つのRSA鍵で複数の署名形式(RSASSA-PKCS_v1_5とRSASSA-PSSなど)に利用してはいけない、らしい。
こちらはハッシュをとるところから手順に含まれている。デフォルトが廃止されたSHA-1を利用するのでできるところでは別のハッシュを指定する方がいいのかもしれない。
秘密鍵の出力形式 は ASN.1 でPKCS #1 では鍵の情報のみ保存する形式がSection A. 1.にあり 暗号化はPEM参照 鍵の識別ができるOIDを付けたり暗号化できるPKCS #8 や PKIな PKCS #12 などは別にある PKCS #8 RFC 5208 5. Private-Key Information Syntax PKCS #1 の形式にOBJECT IDENTIFIER を付けて判別可能にしたもの 一般的にはPKCS #8 形式を BER/DER で符号化してから (AESなど謎技術で)パスフェーズ暗号を付加してPEMでテキストフォーマットにする PKCS #11 ハードウェアなどに実装する場合のインターフェース? PKCS #12 PKI で利用する鍵と証明書のセットなど? 公開鍵の出力形式は?
データ型変換
I2OSP
OS2IP
暗号・復号
RSAEP
RSADP
署名・検証
RSASP1
RSAVP1
暗号化スキーム Padding
RSAES-OAEP
RSAES-PKCS1_v1_5
署名・検証スキーム
RSASSA-PSS
EMSA-PSS
RSASSA-PKCS1_v1_5
EMSA-PKCS1_v1_5
データ列は数値に置き換えてからRSAで処理する。
署名 = RSA(ハッシュ(データ))
暗号(modulusより短いもの) = RSA(Padding(データ))
小さい数のデータは暗号に適さないためRSA-OAEPなどの手順(Padding)がある。
暗号は暗号MODE、署名にはハッシュなどを組み合わせる。
IEEE STD 1363-2000:公開鍵暗号化のための標準仕様。2000年8月、IEEE。
IEEE P1363 working group. IEEE P1363a D11: Draft Standard Specifications for Public Key Cryptography -- Amendment 1: Additional Techniques. December 16, 2002.
IEEE P1363ワーキンググループ。IEEE P1363A D11:公開鍵暗号化の草案標準仕様 - 修正1:追加のテクニック。2002年12月16日。
IEEE 1363
RFC 5990 RSA-KEM
使っている仕様など
PKI 公開鍵暗号基盤 RSA公開鍵などに所有者情報などを足して証明書にしたり、証明書を繋いで連鎖したり。