textbook RSA(c = m^e mod n) 는 결정적이라 같은 평문이 항상 같은 암호문이 되고 작은 지수 공격 · 선택 암호문 공격에 취약하다. 그래서 평문에 패딩을 적용하는데, PKCS#1 v1.5 패딩의 취약점(Bleichenbacher 공격) 을 보완해 PKCS#1 v2.0 부터 도입된 것이 OAEP(Optimal Asymmetric Encryption Padding) 다. 난수를 섞어 같은 평문도 매번 다른 암호문이 된다.
OAEP 는 해시 기반 마스크 생성 함수(MGF1) 두 번을 쓰는 Feistel 구조다.
lHash(label 의 해시) + PS(0 패딩) + 0x01 + 메시지 MmaskedDB = DB XOR MGF1(seed) — 첫 번째 마스킹maskedSeed = seed XOR MGF1(maskedDB) — 두 번째 마스킹EM = 0x00 | maskedSeed | maskedDB 에 RSA 연산(c = EM^e mod n)복호화는 역순이다. EM = c^d mod n 으로 복원한 뒤 MGF1(maskedDB) 로 seed 를, MGF1(seed) 로 DB 를 되찾고, lHash 일치 · 선행 0x00 · 구분자 0x01 위치를 검증한 뒤 M 을 꺼낸다.
256 - 2*32 - 2 = 190 바이트다. 그래서 실제로는 대칭키(AES) 를 RSA-OAEP 로 감싸는 envelope encryption 을 쓴다.