Trong giới hạn của đề tài nhóm em xin trìnhbày đề tài gồm 2 chương như sau: Chương 1: Tìm hiểu về lược đồ OAEP: Chương này trình bày về lý do cần chuyển đổi bản rõ trong hệ mật RSA và tr
Trang 1MỤC LỤC
Trang 2DANH MỤC HÌNH VE
Trang 3LỜI MỞ ĐẦU
Hệ mật mã khóa công khai RSA ra đời là một phát minh vô cùng quantrọng Nó đã được áp dụng rộng rãi trong nhiều lĩnh vực Hệ mật được xem làkhông thể phá được vì nếu muốn tìm khóa thì ta phải làm việc với những con sốkhổng lồ Tuy nhiên, RSA không phải là hoàn hảo, nó vẫn có những sơ hở để kẻxấu lợi dụng Trong phạm vi đề tài này, nhóm em xin trình bày về lược đồchuyển đổi bản rõ OAEP Lược đồ này được coi là đã phần nào làm giảm khảnăng bị tấn công của hệ mật RSA Trong giới hạn của đề tài nhóm em xin trìnhbày đề tài gồm 2 chương như sau:
Chương 1: Tìm hiểu về lược đồ OAEP: Chương này trình bày về lý do
cần chuyển đổi bản rõ trong hệ mật RSA và trình bày sơ đồ mã hóa và giải mãchuyển đổi bản rõ
Chương 2: Chương trình mô phỏng lược đồ chuyển đổi OAEP:
Chương trình mô phỏng quá trình chuyển đổi bản rõ và giải chuyển đổi dùnglược đồ OAEP bằng ngôn ngữ Python
Trang 4CHƯƠNG 1 TÌM HIỂU VỀ OAEP
Thuật toán này sử dụng một cặp khóa là khóa công khai và khóa bí mật để
mã hóa và giải mã Khóa công khai được công bố rộng rãi cho mọi người nhưvậy, ai cũng có thể mã hóa thông tin nhưng chỉ người biết khóa bí mật mới giải
mã được Chính người mã hóa cũng không thể giải mã được Sơ đồ gửi và nhậntin như sau:
Hình 1.1: Sơ đồ mã hóa và giải mã của hệ mật RSA.
Trong đó :
m là bản rõ
Kp là khóa công khai
Ks là khóa bí mật
Thuật toán tạo khóa [2]:
1 Chọn 2 số nguyên tố lớn p và q ngẫu nhiên độc lập
2 Tính: n=p*q (độ dài đề nghị của n ít nhất là 1024 bit)
3 Tính giá trị Ơle: (n)=(p-1)(q-1)
Trang 54 Chọn 1 số tự nhiên e sao cho 1 < e <(n) và [e,(n)]=1
5 Tính d sao cho d*e1 (mod (n))
Kp là (n,e), Ks là (n,d)
Thuật toán mã hóa:
C= me mod nThuật toán giải mã:
Nếu m=0 hoặc m=1 thì sẽ tạo ra C có giá trị tương ứng là 0 hoặc 1
Nếu số e, m có giá trị nhỏ thì me< n, khi đó phép toán modulo sẽ khôngcòn giá trị nữa Vì vậy ta có thể dễ dàng tìm ra m bằng cách khai căn bậc e củaC
Nếu ta mã hóa thông điệp với cùng một khóa thì nó sẽ dẫn đến một lỗhổng Giả sử, có hai thông điệp I và J cùng được mã hóa bằng khóa công khai(n,e) ta sẽ có:
C(I)= Ie mod n
C(J)=Je mod n
C(I)*C(J)=(Ie mod n)(Je mod n)=(I*J)e mod n
Chính vì vậy mà kẻ tấn công có thể thực hiện tấn công lấy dữ liệu bằngphương pháp tấn công lựa chọn bản rõ (CPA- Chosen Plaintext Attack) hay tấncông lựa chọn bản mã (CCA-Chosen Ciphertext Attack) [4]
Để tránh gặp phải những vấn đề trên, RSA trên thực tế sẽ sử dụng mộthình thức chuyển đổi ngẫu nhiên bản rõ m trước khi thực hiện mã hóa Quá trình
Trang 6chuyển đổi này phải đảm bảo cho m không rơi vào các giá trị không an toàn nhưtrên Sau khi chuyển đổi, mỗi bản rõ khi mã hóa sẽ cho ra một trong số tập hợpcác bản mã Điều này làm giảm khả năng cho việc tấn công RSA dựa vào bản rõhay bản mã Một trong các kỹ thuật giúp chuyển đổi bản rõ trước khi thực hiện
mã hóa RSA là kỹ thuật chuyển đổi mã hóa bất đối xứng tối ưu OAEP (OptimalAsymmetric Encryption Padding)
1.3 Lược đồ chuyển đổi bản rõ OAEP
OAEP (Optimal Asymmetric Encryption Padding) là phương thức chuyểnđổi bản rõ của hệ mật RSA được phát minh bởi Mihir Bellare, Phillip Rogawayvào năm 1994 và được cải tiến bởi Don b.Jonhson và Stephen M.Matyas năm1996[]
X || Y Phép nối chuỗi octet X và Y
X Y Cộng(Xor) các bit của chuỗi X với chuỗi Y
Bản tin là chuỗi octet, trong khi đó RSA lại là integer Vì vậy, chúng taphải chuyển đổi từ chuỗi octet sang số nguyên không âm và ngược lại Để làmviệc này có 2 cách thức là I2OSP (Integer To Octet String Primitive) vàOS2IP(Octet String To Integer Primitive)
1.3.2 I2OSP
I2OSP là hàm chuyển một số nguyên không âm thành một chuỗi octet có
độ dài xác định
Trang 7I2OSP(x, xLen):
Đầu vào:
x Số nguyên không âm để chuyển đổi
xLen Độ dài chuỗi octet đầu ra
Đầu ra:
X Là chuỗi octet có độ dài xLen
Lỗi: “Số nguyên quá lớn.”
Các bước thực hiện:
• If x>= 256xLen
Print “Số nguyên quá lớn” và dừng chương trình
• Biểu diễn số nguyên x dưới dạng sau:
x = xxLen-1 256xLen-1 + xxLen-2 256xLen-2 + ……+ x1 256 + x0
với điều kiện 0 ≤ xi< 256
• Mỗi octet Xi biểu diễn cho giá trị nguyên xxLen-ivới điều kiện
1≤ i ≤ xLen Ta có chuỗi octet đầu ra như sau:
Trang 81.3.4 Hàm MGF1
MGF1 là hàm sinh mặt nạ, được xây dựng dựa trên hàm băm Có Hash là
hàm băm với độ dài đầu ra là hLen octet.
MGF1 (mgfSeed, maskLen):
Đầu vào:
mgfSeed Mầm sinh của mặt nạ
maskLen Chiều dài octet dự kiến của mặt nạ
• Kiểm tra: If maskLen > 232 hLen
Print “Mặt nạ quá dài” và dừng chương trình
• Đặt T là một chuỗi octet rỗng
• For counter from 0 to ⌈maskLen/hLen⌉ - 1:
o Chuyển counter thành một chuỗi octet C có độ dài là 4
octet
C = I2OSP (counter, 4)
o Nối chuỗi T với hàm Hash của mầm sinh mgfSeed và C
T = T || Hash (mgfSeed ||C)
• Cho ra chuỗi octet đầu của T với độ dài là maskLen, đó là mask.
1.3.5 Lược đồ chuyển đổi OAEP[1]
Hàm mã hóa OAEP_encrypt(k, M, L):
Đầu vào:
k Độ dài của số lớn n trong hệ mật RSA, n= k octet
M Thông điệp cần mã hóa có độ dài là mLen octet
Trang 9(mLen ≤ k - 2hLen - 2)
L Nhãn tùy chọn có liên quan đến thông điệp, giá trị của Lđược đặt trước, nếu L không được cung cấp thì L sẽ là mộtchuỗi rỗng
• If mLen > k - 2hLen – 2
Print “Thông điệp quá dài” và dừng chương trình
• Nếu nhãn L không được cung cấp, đặt L là một chuỗi rỗng ĐặtlHash = Hash(L), một chuỗi octet có độ dài là hLen Lưu ý, nếu L làchuỗi rỗng, giá trị lHash có biểu diễn hex sau cho các lựa chọn khácnhau của Hash:
o SHA-1: (0x)da39a33ee 5e6b4b0d 3255bfef 95601890afd80709
o SHA - 256: (0x)e3b0c442 98fc1c14 9afbf4c8 996fb92427ae41e4 649b934c a495991b 7852b855
o SHA – 384: (0x)38b060a7 51ac9638 4cd9327e b1b1e36a21fdb711 14be0743 4c0cc7bf 63f6e1da 274edebf e76f65fbd51ad2f1 4898b95b
o SHA – 512: (0x)cf83e135 7eefb8bd f1542850 d66d8007d620e405 0b5715dc 83f4a921 d36ce9ce 47d0d13c 5d85f2b0ff8318d2 877eec2f 63b931bd 47417a81 a538327a f927da3e
Trang 10• Sinh chuỗi octet PS chứa k – mLen – 2hLen-2 byte 0 Độ dài của PS
có thể bằng 0
• Nối lHash, PS, và một octet duy nhất với giá trị hex là 0x01 vàthông báo M để tạo nên khối dữ liệu DB có độ dài k – hLen – 1:
DB = lHash || PS || 0x01 || M
• Sinh một chuỗi octet ngẫu nhiên seed có độ dài hLen
• Đặt dbMask = MGF (seed, k – hLen - 1)
• Đặt maskedDB = DB⊕dbMask
• Đặt seedMask = MGF (maskedDB, hLen).
• Đặt maskedSeed = seed⊕ seedMask
• Nối octet duy nhất với giá trị hex là 0x00, maskedDB vàmaskedSeed để tạo thông báo EM có độ dài k octet để dùng cho mãhóa RSA:
EM = 0x00 || maskedSeed || maskedDB
Trang 11Hình 1.2: Lược đồ mã hóa OAEP.
Hàm giải mã OAEP_decrypt (k, EM, L):
Đầu vào:
K Độ dài của số lớn n trong hệ mật RSA ,Với n = k octet
L Là nhãn tùy chọn liên quan đến thông điệp, giá trị mặc định
của L là chuỗi rỗng nếu không được cung cấp
EM Bản mã, một chuỗi octet với độ dài là k’.
Đầu ra:
M Là thông điệp, một chuỗi octet có độ dài mLen, với
Trang 12• Nếu độ dài của bản mã C không là k octet thì cho ra “Lỗi giải mã”
• Đặt seedMask = MGF (maskedDB, hLen)
• Đặt seed = maskedSeed⊕seedMask
• Đặt dbMask = MGF (seed, k – hLen - 1)
• Đưa ra thông điệp M
Trang 13Hình 1.3: Lược đồ giải mã OAEP.
1.4Đánh giá độ an toàn của lược đồ OAEP
Dựa vào sơ đồ mã hóa và giải mã trên ta có thể thấy, trong sơ đồ có xuất
hiện yếu tố ngẫu nhiên “seed”, có sử dụng hàm mặt nạ MGF1 được xây dựng
dựa trên hàm băm Những yếu tố này làm cho bản mã được tạo ra có tính antoàn, chống lại được các tấn công lựa chọn bản mã (CCA)
• Seed là yếu tố mang tính ngẫu nhiên, tại mỗi thời điểm seed này sẽ
sinh ra một số khác nhau để thêm vào bản mã và được sử dụng choquá trình chuyển đổi Do vậy, với một bản rõ tại mỗi thời điểm mãhóa khác nhau sẽ cho ra một bản mã khác nhau
Trang 14• Hàm mặt nạ MGF1 được xây dựng dựa trên hàm băm nên nó sẽ cóđầy đủ các tính chất của một hàm băm Ngoài ra, trong hàm MGF1
có sử dụng thêm một yếu tố mang tính ngẫu nhiên Vì vậy kẻ tấncông khó để có thể truy ngược lại bản rõ khi có bản mã hay xâydựng một cơ sở dữ liệu để thực hiện tấn công lựa chọn bản rõ(CPA)
Ngoài ra cũng có thể tham khảo về các chứng minh toán học cho độ an
toàn của OAEP ở tài liệu [3]
Trang 15CHƯƠNG 2 CHƯƠNG TRÌNH MÔ PHỎNG LƯỢC ĐỒ OAEP
2.1 Giới thiệu chương trình
Chương trình mô phỏng được viết bằng ngôn ngữ Python, dựa trên công
cụ IDLE 2.7.5(Python GUI – Graphic User Interface), từ phiên bản 3.0 về sauchương trình có thể sẽ khác.Chú ý, nếu chương trình chạy báo lỗi, chúng ta nênkiểm tra lại độ thụt vào của các khối lệnh, vì trong Python hiểu các dòng lệnh có
độ thụt vào giống nhau là một khối lệnh
2.2Chương trình mô phỏng
Đầu tiên ta sẽ import các thư viện cần thiết và bản rõ cần chuyển đổi:from hashlib import sha1
from binascii import hexlify
from random import randint
M1 = 'Hello world'
M2 = hexlify(M1) #convert string to hex
M3 = bin(int(M2, 16)) # convert hex to binary
Tiếp theo là hàm băm được sử dụng, trong đó có nhãn L, mặc định là
chuỗi rỗng:
L = '' #message provided
lHash = sha1(L).digest() #sha1 hash function
hLen = int(sha1().digest_size) #size of sha1
Tiếp tục ta sẽ định nghĩa một hàm để tạo chuỗi octet ngẫu nhiên, hàm
Trang 16Tiếp theo sẽ tới hàm chuyển đổi từ mã hex sang byte, hàm HexToByte(), tham sốhexStr truyền vào là một chuỗi ở dạng hex.
Hàm tiếp theo sẽ là hàm tạo mặt nạ MGF1, có 2 tham số truyền vào.
def MGF1(mgfSeed, maskLen):
Trang 17print('Integer too large')
Hàm tiếp theo được khai báo đó là hàm xorOctetStr, có nhiệm vụ xor 2
byte với nhau
Trang 18Đầu tiên là hàm chuyển đổi OAEP_encode(M, k)
def OAEP_encode(M, k):
mLen = len(M)/2
-')
M = HexToByte(M)
k = k/8 # bit > octet
if (len(L) > 2**61-1):
print('Label too long')
elif (mLen > (k-2*hLen-2)):
print('Message too long')
seedMask = MGF1(maskedDB, hLen)
# Xor 2 operatemaskedSeed = xorOctetStr(seed, seedMask)
encodeM = bytearray(1) + maskedSeed + maskedDB
Trang 19seedMask = MGF1(maskedDB, hLen)
seed = xorOctetStr(maskedSeed, seedMask)dbMask = MGF1(seed, k-hLen-1)
Trang 20for i in xrange(l, k-hLen-1):
Và sau khi thực hiện chuyển đổi bản rõ ta được như sau:
Hình 2.1: Thực hiện chuyển đổi bản rõ
Trang 21Sau khi có được octet string, ta tiến hành giải chuyển đổi bản rõ ta sẽ được như sau:
Hình 2.2: Thực hiện giải chuyển đổi
Trang 22KẾT LUẬN
Sau một thời gian thực hiện đề tài, với sự nỗ lực của ba thành viên, nhóm
em đã thực hiện tốt các mục tiêu đề ra và đạt được những kết quả sau:
Kết quả đạt được:
• Hiểu được lý do tại sao cần chuyển đổi bản rõ trong hệ mật RSA
• Đọc, hiểu được lược đồ chuyển đổi và giải chuyển đổi OAEP
• Nắm được độ an toàn của lược đồ
• Viết được chương trình mô phỏng quá trình chuyển đổi bằng lược
Trang 23TÀI LIỆU THAM KHẢO
[1] RSA Laboratories, PKCS #1 v2.2: RSA Cryptography Standard, October
27 th , 2012
[2] RSA Laboratories, RSAES-OAEP Encryption Scheme
[3] Eiichiro Fujisaki, Tastuakia Okamoto, David Pointcheval and Jacques
Stern, RSA-OAEP is Secure under the RSA Assumption, May 28 th , 2001
[4] James Manger, A Chosen Ciphertext Attack on RSA Optimal Asymmetric
Encryption Padding (OAEP) as Standardized in PKCS #1 v2.0
PTION_PADDING
[6] http://vi.wikipedia.org/wiki/RSA_(mã_hóa)#An_ninh