Lƣợc đồ RSAES - OAEP là sự kết hợp các cơ sở mã hóa và giải mã RSAES, RSADP cùng với phƣơng thức mã hóa EME – OAEP. (OAEP là viết tắt của cụm từ: “Optimal Asymmetric Encryption Padding” – chuyển đổi mã hóa bất đối xứng tối ƣu). Phƣơng thức mã hóa EME – OAPEP dựa trên cơ sở lƣợc đồ chuyển đổi mã hóa bất đối xứng tối ƣu (OAEP) đƣợc phát minh bởi Mihir Bellare và Phillip Rogaway (1994), sau đƣợc phát triển bởi Don B. Johnson và Stephen M. Matyas (1996). Nó tƣơng thích với lƣợc đồ IFES đƣợc định nghĩa trong chuẩn IEEE Std 1363 – 2000. Trong đó, cơ sở mã hóa và giải mã là IFEP – RSA và IFDP – RSA, phƣơng thức mã hóa thông điệp là EME – OAEP. Lƣợc đồ mã hóa RSAES - OAEP có thể hoạt động trên một thông điệp với độ dài tới k - 2hLen – 2 octet, trong đó hLen là độ dài đầu ra của hàm băm đƣợc sử dụng và k là độ dài tính theo octet của modulo RSA của ngƣời nhận. Thực chất phƣơng thức mã hóa EME - OAEP là phƣơng pháp độn thông điệp (thông thƣờng có chiều dài ngắn hơn chiều dài modulo RSA) để có khối dữ liệu (EM) có chiều dài bằng modulo RSA trƣớc khi áp dụng các RSAES mã hóa thông điệp
1/. Hoạt động mã hóa
EME - OAEP – ENCRYPT(n, e), M, L)
Tùy chọn: hàm băm Hash (chiều dài đầu ra là hLen octet) MGF hàm sinh mặt nạ
Input:
(n, e) khóa công khai RSA của ngƣời nhận (k là chiều dài tính theo octet của modulo RSA n)
M thông điệp đƣợc mã hóa, một chuỗi octet với chiều dài mLen, trong đó mLen k – 2hLen - 2
L nhãn (không bắt buộc) để kết hợp với thông điệp M; giá trị mặc định cho L nếu L không đƣợc cung cấp là một xâu rỗng.
Output:
C Bản mã, một chuỗi octet với chiều dài k
Error: “thông điệp quá dài”; “nhãn quá dài”
Giả định: Khóa công khai RSA(n, e) là hợp lệ
Các bước:
1/ Kiểm tra các độ dài
a. Nếu chiều dài của L lớn hơn giới hạn cho đầu vào của hàm băm (261 – 1 octet đối với SHA – 1), ra “nhãn quá dài” và dừng
b. Nếu mLen > k – 2hLen – 2, ra “Thông điệp quá dài” và dừng 2/ EME - OAEP encoding (hình bên dƣới)
a. Nếu nhãn L không đƣợc cung cấp, cho L là một xâu rỗng. Tính lHash = Hash(L), một chuỗi octet với chiều dài hLen (xem ghi chú bên dƣới)
b. Sinh một chuỗi octet PS gồ có k – mLen – 2hLen – 2 zero – octet. Chiều dài của PS có thể là 0
c. Ghép lHash, PS, một octet đơn với giá trị trong hệ cơ số 16 là 0x01, và thông điệp M để đƣợc một khối dữ liệu DB với chiều dài k – hLen – 1 octet:
DB = lHash || PS || 0x01 || M
d. Sinh ngẫu nhiêu một chuỗi octet seed (hạt giống) với chiều dài hLen e. dbMask = MGF (seed, k – hLen – 1)
f. maskedDB = DB dbMask.
g. seedMask = MGF (maskedDB, hLen) h. maskedSeed = seed seedMask
i. Ghép một octet đơn với giá trị trong hệ cơ số 16 là 0x00, maskedSeed, và maskedDB để đƣợc một thông điệp mã hóa EM với chiều dài k octet:
EM = 0x00 || maskedSeed || maskedDB 3/ RSA encryption
a. Chuyển đổi thông điệp mã hóa EM sang dạng số nguyên m biểu diễn thông điệp:
m = OS2IP (EM)
b. Áp dụng nguyên thủy mã hóa RSAEP với khóa công khai RSA (n, e) và biểu diễn thông điệp m để sinh ra một số nguyên biểu diễn bản mã c:
c = RSAEP ((n, e), m)
c. Chuyển đổi biểu diễn bản mã c sang dạng biểu diễn C gồm k octet C = I2OSP (c, k)
4/ Ra bản mã C.
Ghi chú: Nếu L là một xâu rỗng giá trị băm lHash tƣơng ứng có thể mang các giá trị nhƣ dƣới đây, ứng với hàm băm đƣợc sử dụng
SHA – 1: (0x) da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709
SHA – 256: (0x) e3b0c442 98fc1c14 9afbf4c8 996fb924 649b934c a495991b 7852b855
SHA – 384: (0x) 38b060a7 51ac9638 4cd9327e b1b1e36a 21fdb711 14be0743 4c0cc7bf 63f6e1da 274edebf e76f65fb d51ad2f1 4898b95b SHA – 512: (0x) cf83e135 7eefb8bd f1542850 d668007 d620e405 ob5715dc 83f4a921 d36ce9ce 47d0d13c 5d85f2b0 ff8318d2 877eec2f 63b931bd 47417a81 a538327a f927da3e
Hình 2.5: Tóm lược quy trình xử lý RSAES – OAEP - ENCRYPT
2/. Hoạt động giải mã
Tùy chọn: hàm băm (chiều dài đầu ra là hLen octet) MGF hàm sinh mặt nạ
Input:
K: Khóa bí mật RSA của ngƣời nhận (k là chiều dài modulo RSA n) C: bản mã, một chuỗi octet với chiều dài k, trong đó k 2hLen + 2
L: nhãn tùy chọn, kết hợp với thông điệp đƣợc thẩm định; giá trị mặc định cho l, nếu L không đƣợc cung cấp, là một xâu rỗng
L
EMM -OAEP
Encoding I2OSP
OS2IP RSAEP RSA Public
key M C L EM m c
Output:
M: thông điệp, một chuỗi octet với chiều dài mLen, trong đó mLen k – 2hLen – 2
Error: “Lỗi giải mã”
Các bước:
1/ Kiểm tra độ dài:
a. Nếu chiều dài của L lớn hơn giới hạn đầu vào của hàm băm (261
– 1 octet đối với SHA – 1), ra lỗi “Lỗi giải mã” và dừng
b. Nếu chiều dài của bản mã C khác k octet, ra “Lỗi giải mã” và dừng c. Nếu k < 2hLen + 2, ra “Lỗi giải mã” và dừng
2/ RSA decryption:
a. Chuyển đổi bản mã C sang dạng biểu diễn số nguyên của bản mã c:
c = OS2IP©
b. Áp dụng nguyên thủy giải mã RSADP với khóa bí mật RSA K và biểu diễn bản mã c để sinh ra một thông điệp ở dạng số nguyên m: m = RSADP(K, c)
Nếu RSADP đƣa ra “Biểu diễn bản mã nằm ngoài phạm vi” (có nghĩa là c n), ra “Lỗi giải mã” và dừng
c. Chuyển đổi biểu diễn thông điệp m về dạng thông điệp mã hóa EM với chiều dài k octet: EM = I2OSP(m, k)
3/ EME - OAEP decoding:
a. Nếu nhãn L không đƣợc cung cấp, L là một xâu rỗng. Gán lHash = Hash (L), một chuỗi octet với chiều dài hLen
b. Tách rời thông điệp mã hóa EM ra một octet đơn Y, một chuỗi octet maskedSeed với chiều dài hLen, và một chuỗi octet maskedDB với chiều dài k – hLen – 1:
EM = Y || maskedSeed || maskedDB c. seedMask = MGF (maskedDB, hLen)
d. seed = maskedSeed seedMask e. dbMask = MGF (seed, k – hLen – 1) f. DB = maskedDB dbMask
g. Tách DB ra một chuỗi octet lHash’ với chiều dài hLen, một chuỗi độn (có thể rỗng) PS bao gồm octet với giá trị biểu diễn trong cơ số 16 là 0x00 và một thông điệp M:
DB = lHash’ || PS || 0x01 || M
Nếu không có octet với giá trị 0x01 (cơ số 16) ngăn cách PS và M, nếu lHash khác lHash’, hoặc nếu Y khác không ra “Lỗi giải mã” và dừng
Hình 2.6: Tóm lược quy trình xử lý RSAES – OAEP - DECRYPT