Mật mã xếp ba lô Merkle-Hellman là một trong những hệ mật mã khóa công khai ra đời sớm nhất, do Ralph Merkle và Martin Hellman phát minh vào năm 1978. Về mặt ý tưởng hệ mật mã này được xây dựng đơn giản hơn nhiều so với hệ RSA nhưng nó đã nhanh chóng bị đổ vỡ.
Mô tả: Merkle-Hellman là một hệ mật mã bất đối xứng, có nghĩa là khi giao dịch cần có hai khóa: một khóa cơng khai và một khóa riêng. Hơn nữa, cũng giống như RSA, hai khóa đó đều là một chiều với nghĩa là khóa cơng khai chỉ dùng để mã hóa cịn khóa riêng chỉ dùng để giải mã, cũng vì vậy nó khơng thể sử dụng để nhận dạng qua việc ký tên bằng mật mã.
Về mặt toán học, hệ Merkle-Hellman dựa trên bài toán tổng tập hợp con subset sum problem (một trường hợp riêng trong bài toán “cái ba lơ” (knapsack) quen thuộc trong Tốn rời rạc).
Bài tốn có thể phát biểu như sau: Cho một tập hợp các con số A và một con số b, hãy tìm một tập hợp con của A cộng lại bằng b. Trong trường hợp tổng quát, bài toán đó được biết là có tính NP- đủ (NP complete) (khó giải bậc NP). Tuy nhiên trong trường hợp riêng khi tập hợp các con số (được gọi là cái ba lô) là “siêu tăng” (superincreasing) với nghĩa là có thể sắp xếp thành một dãy để cho mỗi phần tử của tập hợp đều lớn hơn tổng các phần tử đi trước nó, thì bài tốn có thể giải được “dễ dàng” trong thời gian đa thức bằng một thuật toán “tham lam” đơn giản.
Tạo khóa: Trong hệ mật mã Merkle-Hellman, các khóa là các “ba
lô”. Khóa công khai là một “ba lô đầy” còn khóa riêng là một “ba lô vơi” (hard and easy knapsacks) kết hợp với hai số phần tử của phép cộng, một số nhân và một modulo, các số này được dùng để biến đổi các ba lô siêu tăng thành ba lô đầy. Những con số đó cũng được dùng để biến đổi tổng của các tập con của ba lô đầy thành tổng các tập con của ba lô vơi, tính toán thực hiện được trong thời gian đa thức.
Mã hóa: Để mã hóa một thơng điệp, một tập con cả ba lô đầy được
chọn ra bằng cách so sánh nó với một tập hợp các bit (plaintext) có độ dài bằng độ dài chìa khóa và làm cho mỗi thành phần ứng với số 1 trong plaintext một phần tử trong tập con mà bỏ qua những thành phần ứng với số 0 trong plaintext. Các phần tử của tập con đó cộng lại với nhau, tổng số thu được cho ta ciphertext.
Giải mã: Việc giải mã thực hiện được bởi vì số nhân và modulo đã
dùng để biến đổi ba lô vơi siêu tăng thành khóa công khai, cũng có thể dùng để biến đổi con số đại diện cho ciphertext thành tổng các phần tử tương ứng của balô siêu tăng. Như vậy, dùng một thuật toán tham lam đơn giản, balô vơi giải ra được bằng cách dùng O(n) phép toán số học để giải mã.
4.4. HÀM BĂM