RSAES-OAEP
RSAの暗号スキームの最新版
RSAESを適度に読みにくくしてからRSAにかける
RFC 8017 PKCS #1 RSA 7.1.
https://tex2e.github.io/rfc-translater/html/rfc8017.html#7--Encryption-Schemes
RFC 5756 旧?
RFC 4055 OIDなど
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/block/RSAES_OAEP.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/padding/EME_OAEP.java
入力
RSA鍵
MGF
MGF1(暗号ハッシュ関数)
MD 暗号ハッシュ関数
乱数生成器 (暗号用) PRF?
L ラベル
M メッセージ
RFC 5756でRSASSA用のMGFはMGF1とXOF(SHAKE128, SHAKE256)があるが、RSAES-OAEPで利用可能なのはMGF1のみ?、その他のXOFも利用できるかもしれない
乱数生成器は暗号用のものを利用する 一般的な乱数生成器は疑似的なものなので十分な長さ(周期?)が足りなかったりするらしい
RSA鍵長 k = (modules長(bit) + 7) / 8
ハッシュ長 hLen = MDのハッシュ長(byte)
k がhLen*2 + M長 + 2以上あること
Mの最大長
RSA2048 SHA256の場合 (2048 - 256 * 2) / 8 - 2 = 256 - 32*2 - 2 = 190 byte まで
RSA2048 SHA512の場合 (2048 - 512 * 2) / 8 - 2 = 256 - 64*2- 2 = 126 byte まで
Mに同じハッシュ関数の値を利用するならハッシュ長の3倍以上のRSA鍵が必要
ラベルを暗号ハッシュ関数でハッシュ化する
lHash = MD(L);
lLen = Lの長さ(バイト) 2^62ぐらいまで (SHA-1の場合)
DB k - hLen - 1
| lHash | PS | 01 | m |
PS は 00 Padding 長さ 0以上
seed hLen
| 乱数 |
maskedDB = DB XOR MGF(seed)
maskedSeed = seed XOR MGF(maskedDB)
マスクはDBとseed全体にかかるので互いに撹拌された状態になる
|00|maskedSeed|maskedDB|
がEME_OAEPで難読化された状態
RSA鍵で暗号化して返す
RFC 4055
4.1. RSAES-OAEP公開鍵
識別子
code:RSAES-OAEP
id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 }
RSAES-OAEP-params ::= SEQUENCE {
hashFunc 0 AlgorithmIdentifier DEFAULT
sha1Identifier,
maskGenFunc 1 AlgorithmIdentifier DEFAULT
mgf1SHA1Identifier,
pSourceFunc 2 AlgorithmIdentifier DEFAULT
pSpecifiedEmptyIdentifier }
pSpecifiedEmptyIdentifier AlgorithmIdentifier ::=
{ id-pSpecified, nullOctetString }
nullOctetString OCTET STRING (SIZE (0)) ::= { ''H }
rSAES-OAEP-Default-Identifier AlgorithmIdentifier ::=
{ id-RSAES-OAEP,
rSAES-OAEP-Default-Params }
rSAES-OAEP-Default-Params RSAES-OAEP-params ::=
{ sha1Identifier,
mgf1SHA1Identifier,
pSpecifiedEmptyIdentifier }
AlgorithmIdentifier
OBJECT IDENTIFIER