Hệ mã mũ của Pohligvà Hellman

Một phần của tài liệu MỘT SỐ ỨNG DỤNG CỦA SỐ HỌC TRONG LÝ THUYẾT MẬT MÃ (Trang 28 - 31)

2 Một số ứng dụng của số học trong lý thuyết mật mã

2.2.1 Hệ mã mũ của Pohligvà Hellman

Nguyên lý thực hiện

Giả sử p là một số nguyên tố lẻ, và khoá lập mã e là một số tự nhiên sao cho (e, p−1) = 1. Cũng như mã Ceasar, để mã hóa một thông báo, trước tiên ta chuyển các chữ cái (29 chữ) thành dạng các chữ số tương ứng (thêm 0 vào trước những số có một chữ số). Ta dùng bảng sau đây:

a ă â b c d đ e ê g h i 01 02 03 04 05 06 07 08 09 10 11 12 k l m n o ô ơ p q r s t 13 14 15 16 17 18 19 20 21 22 23 24 u ư v x y 25 26 27 28 29

Sau đó ta nhóm các số nhận được thành từng nhóm 2m chữ số, theo nguyên tắc M = 2m là số nguyên chẵn lớn nhất sao cho mọi số tương ứng m chữ cái đều nhỏ hơn p, tức là p > M. Như vậy nếu số nguyên tố p đã cho trước thì số m (độ dài khối) cần phải chọn sao cho thoả mãn điều kiện trên. Ví dụ

nếu p = 292345 thì m không thể chọn lớn hơn 2. Sau khi xác định độ dài của khối, ta cần tiến hành "làm tròn" văn bản bằng cách thêm một ký tự nào đó (ví dụ là x) vào cuối văn bản để văn bản có độ dài là bội số của m, điều này không gây nhầm lẫn khi đọc thông báo.

Ta thực hiện mã hóa theo công thức sau:

C ≡ Pe (mod p), 0≤ P < p

Văn bản mật sẽ chứa những khối chữ số là các số nguyên nhỏ hơn p .

Muốn giải mã văn bản mật, trước hết ta tìm một số d thoả mãn de ≡ 1

(d là chìa khoá giải mã), có nghĩa d là một nghịch đảo của e theo modulo

(p−1). Nghịch đảo này tồn tại do giả thiết ban đầu (e, p−1) = 1. Theo hệ quả 1.2.4.2, với ϕ(p) = p−1ta có

Cd ≡ (Pe)d ≡ Ped ≡ Pk(p−1)+1 ≡ P (mod p), (k nguyên)

tức là để giải mã khối (trong văn bản mật) ta chỉ việc thực hiện phép nâng lên luỹ thừa bậc d modulo p (tránh được phép "khai căn rời rạc").

Ví dụ: Dùng Maple mã hoá văn bản

[> p := nextprime(5293573957395735387563478134577221441734); 5293573957395735387563478134577221441783

[> oblocksize := nops(convert(p, base, 256)); 17

[> iblocksize := oblocksize-1; 16

[> e := nextprime(5879538593758935789352345677777); 5879538593758935789352345678009

[> vbgoc := " Lap ma la viec rat de dang , giai ma la viec rat kho khan ."; " Lap ma la viec rat de dang , giai ma la viec rat kho khan ."

[> keyenc := eval([e, p]):

[> vbbytes := convert(vbgoc, bytes):

[> q := nops(vbbytes):

[> blockfill := iblocksize-irem(q, iblocksize):

[> vbrodaydu := [op(vbbytes), seq(blockfill, i = 1 .. blockfill)]:

[> vbrohex := [seq(cat(seq(0, k = 1 .. (2- length(vbrohex[i]))), vbrohex[i]), i = 1 .. nops(vbrohex))]:

[> vbronhom := [seq(vbrohex[(i-1)*iblocksize+1 .. min(i*iblocksize, nops(vbrohex))], i = 1 .. (ceil(nops(vbrohex)/iblocksize)))]:

[> vbrokhoi := [seq(cat(op(vbronhom[i])), i = 1 .. nops(vbronhom))]:

[> vbroso := [seq(convert(vbrokhoi[i], decimal, hex), i = 1 .. nops(vbrokhoi))]:

[> vbmaso := [seq((vbroso[i]&∧keyenc[1] mod keyenc[2]), i = 1 .. nops(vbroso))]:

[> vbmakhoi := [seq(convert(vbmaso[i], base, 256), i = 1 .. nops(vbmaso))]:

[> vbmakhoi := [seq([op(vbmakhoi[i]), seq(0, j = nops(vbmakhoi[i])+1 .. oblocksize)],i = 1 .. nops(vbmakhoi))]:

[> vbmakhoi := [seq([seq(vbmakhoi[i][nops(vbmakhoi[i])+1-k], k = 1 .. nops (vbmakhoi[i]))], i = 1 .. nops(vbmakhoi))]:

[> vbmabyte := [seq(op(vbmakhoi[i]), i = 1 .. nops(vbmakhoi))]:

[> vbma := vbmabyte; [10, 158, 180, 99, 29, 103, 63, 71, 11, 172, 159, 128, 205, 197, 231, 181, 196, 0, 46, 32, 227, 0, 92, 146, 229, 47, 17, 75, 186, 223, 236, 16, 37, 227, 11, 57, 238, 48, 69, 74, 173, 0, 31, 80, 202, 111, 10, 163, 110, 232, 93, 11, 186, 206, 237, 159, 136, 178, 199, 252, 230, 9, 69, 226, 117, 102, 255, 235]. Độ an toàn

Muốn mã hóa một khối P trong văn bản, ta cần tính Pe (mod p), các phép tính bít cần thiết là O((log2p)3)

Để giải mã trước hết ta phải tìm nghịch đảo d của e modulo (p−1)điều này thực hiện được với O((logp)3) phép tính bit và chỉ cần làm một lần. Tiếp theo ta tính thặng dư nguyên dương bé nhất của Cd modulo p , số các phép tính bit đòi hỏi là O((log2p)3). Như vậy, thuật toán lập mã và giải mã được thực hiện tương đối nhanh bằng máy tính. Tuy nhiên thực tế việc tìm ra chìa khóa là hầu như không thể nếu không biết e.

(mod p). Khi đó thuật toán nhanh nhất tìmeđòi hỏi khoảng exp( logp.loglogp)

phép tính bit. Khipcó khoảng 100 chữ số thập phân, việc tìm logaritmodulo pcần khoảng 74 năm, cònpcó khoảng 200 chữ số thời gian cần thiết là hàng tỷ năm.

Nhận xét:

Hệ mã mũ nêu trên là một hệ bí mật vì các số e, d đều phải giữ bí mật. Tuy nhiên, ý tưởng về việc sử dụng định lý Fermat để thay thế phép tính "Căn rời rạc" (của việc giải mã) bằng phép tính luỹ thừa thì quả là tuyệt vời. Ta sẽ gặp lại ý tưởng này trong hệ mã công khai RSA. Trước hết, chúng ta làm quen với một hệ mã đơn giản hơn, tuy mới chỉ phần nào mang tính phi đối xứng nhưng cũng rất hữu ích.

Trong các hệ mã sau đây thường có nhiều người tham gia A, B, C, ... người ta thống nhất chung việc chọn số nguyên tố p và phân tử cơ sở g của nhóm

F∗p(phép tính được lấy theo modulo p). Mỗi người chọn cho mình một con số làm chìa khoá bí mật, chẳng hạn là kA, kB, kC, ... Những giá trị gkA, gkB,

gkC, ... có thể được công bố công khai (thường xem là chìa khoá công khai), vì từ đây không thể tìm được chìa khoá bí mật của từng người, khi p được chọn đủ lớn.

Một phần của tài liệu MỘT SỐ ỨNG DỤNG CỦA SỐ HỌC TRONG LÝ THUYẾT MẬT MÃ (Trang 28 - 31)

Tải bản đầy đủ (PDF)

(48 trang)