Tạo khoá:
Nếu S > an Nếu S < an
Để sử dụng hệ mật mã khoá công khai ba lô Merkle-Hellman [1], [4],mỗi người sử dụng phải tạo riêng một cặp khoá gồm khoá công khai, và khoá riêng như sau:
Chọn một vector ba lô siêu tăng a = (a1, a2,…,an). (khoảng 100 phần tử).
Chọn một số nguyên m > n
i =1ai và một số w sao cho gcd (w, m) = 1.
Nhân các phần tử của vector a với w modulo m, kết quả thu được là vector ba lô b = (b1, b2,…,bn), trong đó bi = w * ai mod m, và i = 1,…,n.
Công bố vector ba lô b = (b1, b2,…,bn) như khoá công khai, các số w, m và vector ba lô siêu tăng a = (a1, a2,…,an) được giữ bí mật làm khoá riêng. Mã hoá:
Hệ mật mã khoá công khai ba lô Merkle-Hellman, thực hiện mã hoá theo từng khối n-bits với n là số phần tử của vector ba lô lập mã b. Giả sử người sử dụng A muốn mã hoá thông điệp M để gửi cho B, thì phía A phải thực hiện như sau:
Biến đổi các ký tự trong thông điệp thành chuỗi nhị phân theo qui tắc sau:
Bảng 2.1. Qui tắc chuyển đổi ký tự 5-bits nhị phân ( - khoảng trắng)
Ký tự Mã nhị phân Ký tự Mã nhị phân 00000 M 01101 A 00001 N 01110 B 00010 O 01111 C 00011 P 10000 D 00100 Q 10001 E 00101 R 10010 F 00110 S 10011 G 00111 T 10100 H 01000 U 10101 I 01001 V 10110 J 01010 X 10111 K 01011 Y 11000 L 01100 Z 11001
Chia thông điệp thành từng khối có chiều dài n-bits với n là số phần tử của vector ba lô b, kết quả thu được một dãy gồm k khối M1, M2,…,Mk, mỗi khối là một vector Mi = (xi1, xi2,…, xin), với:
xị = {0, 1}, 1 ≤ i ≤ kvà 1 ≤ j ≤ n.
Thực hiện mã hoá lần lượt từng khối bits Mi thành số nguyên Ci(i = 1,…, k) bằng cách tính: Ci = ij n i j x b 1 = b1 * xi1 +…+ bn * xin.
Tập các số nguyên C = {C1, C2,…,Ck} là bản mã chuyển đến người nhận B. Giải mã:
Khi nhận được bản mã C, người nhận B giải mã lần lượt từng số Ci như sau:
Tính các tổng Si = Ci * w-1 mod m, với i = 1,…, k. ở đây w-1 là phần tử nghịch đảo của w mod m: w * w-1 1 (mod m).
Giải lần lượt bài toán ba lô siêu tăng với vector a = (a1, a2,…,an) với các số Si tính được. Kết quả là một dãy các khối số M1, M2,…,Mk trong đó mỗi khối là một vector Mi = (xi1, xi2,…, xin), với xij = {0, 1}, 1 ≤ i ≤ kvà1 ≤ j ≤ n.
Thực hiện phép biến đổi ngược từ các chuổi bits thành các ký tự tương ứng, để phục hồi lại thông điệp M ban đầu.
Bảng 2.2 Các bước tạo khoá, mã hoá, giải mã của Hệ ba lô Merkele-Hellman
Tạo khoá:
Tạo vector siêu tăng a = (a1,…,an).
Chọn m sao cho m > n i1 ai chọnw sao cho gcd(w, m) = 1. Tính vector b = (b1, b2,…,bn) với các phần tử bi = w * ai mod m
Mã hoá: Mã hoá thông điệp M
Biến đổi M = (x1, x1,…, xn), với xi = {0, 1}. Tính C = n i i i b x 1
Khoá công khai: b = (b1, b2,…,bn).
Khoá riêng: a = (a1, a2,…,an), w, m.
Gải mã: Phục hồi thông điệp M.
Tính S = C * w -1 mod m.
Giải bài toán ba lô với vector siêu tăng a = (a1, a2,…,an) và tổng S, khôi phục bản rõ M.