3. Cấu trúc luận văn
2.5 Mã hóa và giải mã LWE và GGH
Thuật toán sinh khóa: Sinh khóa công khai và khóa bí mật cho LWE [47]. Khóa bí mật: Là véctơ s được chọn từ ℤqn.
Khóa công khai:
• Ta chọn A gồm m véctơ được chọn một cách ngẫu nhiên A = [a1, a2, …, am] với a1, a2, …, am là các số nguyên thuộc ℤqn.
• Ta chọn e gồm m véctơ gồm các số nguyên đủ nhỏ được chọn một cách ngẫu nhiên.
• Ta tính toán được B với B = As + e (mod q). Đến đây ta kết thúc quá trình sinh khóa công khai với cặp khóa công khai là (A, B).
Input: Một cơ sở B cho Lattice và một véctơ w ∈ ℝn
Output: véctơ v gần nhất với véctơ w và ∈ L
1. Tính toán w = Br với r ∈ ℝn
2. Cho i chạy từ 1 cho đến n 3. Đặt zi ⃪[ri]
22
Thuật toán Mã hóa: Ta mã hóa đoạn văn bản muốn truyền đi thành một tập hợp của các số nguyên (véctơ), ví dụ như sử dụng bảng mã ASCII cho từng ký tự thuộc văn bản. Mỗi ký tự sau khi chuyển sang giá trị tương ứng trên bản mã ASCII sẽ được chuyển sang dạng nhị phân và lưu thành 8 bits. Cuối cùng ta chuyển bản tin truyền đi thành một chuỗi của nhiều dãy 8 bits và sẵn sàng cho quá trình mã hóa.
Với mỗi bit từ bản tin truyền đi, ta chọn một mẫu từ khóa công khai A tạm gọi là Asample và một mẫu từ khóa công khai B tạm gọi là Bsample (mẫu là tập hợp con của A hoặc B). Ta tính toán được cặp giá trị u và v với:
• u = ∑ 𝐴𝑠𝑎𝑚𝑝𝑙𝑒 (mod q)
• v = ∑ 𝐵𝑠𝑎𝑚𝑝𝑙𝑒 + 𝑞
2 . m (với m là giá trị bit tương ứng)
Kết thúc quá trình mã hóa với đầu ra là mỗi cặp (u, v) tương ứng với mỗi bit. Tức với mỗi ký tự ta có đầu ra quá trình mã hóa là 8 cặp (u, v).
Thuật toán Giải mã: Ta nhận giá trị đầu ra của quá trình mã hóa là các cặp (u, v), giờ là lúc ta sử dụng khóa bí mật để giải mã. Ta tính toán thông qua một biến trung gian tạm gọi là Dec:
Dec = v – su (mod q)
Với mỗi giá trị Dec, ta so sánh Dec với q/2:
• Dec < q/2 thì đồng nghĩa với việc bit tương ứng trong bản rõ là 0.
• Ngược lại, Dec > q/2 thì bit tương ứng trong bản rõ là 1.
Lặp lại như vậy với từng cặp (u, v) đến cuối ta nhận được kết quả là một chuỗi các giá trị 8 bits. Với mỗi 8 bits ta chuyển ngược lại sang giá trị số nguyên của chúng rồi chuyển tiếp sang giá trị ký tự theo bảng mã ASCII. Kết thúc quá trình giải mã ta nhận được bản rõ.
Xét về tính đúng đắn của hệ mật LWE: nếu không tồn tại lỗi trong mẫu
thiết kế LWE thì quá trình giải mã luôn luôn có kết quả chính xác. Quá trình giải mã chỉ xảy ra lỗi khi và chỉ khi tổng các điều kiện lỗi trên toàn bộ S lớn hơn q/4. Ta đang tính tổng m số hạng sai số thông thường, mỗi số hạng có độ lệch chuẩn là 𝛼q nên độ lệch chuẩn tối đa là √𝑚 (𝛼q) < q/log n; với một phép tính tiêu chuẩn thì ta thấy xác suất để một biến thông thường lớn hơn q/4 là không đáng kể.
2.5.2 Hệ mật GGH
23 cơ sở sinh ra mạng Lattice L để làm khóa bí mật và khóa công khai [47]. Cơ sở có tính trực giao cao sẽ là khóa bí mật và ngược lại cơ sở có tính trực giao thấp sẽ là khóa công khai. Hadamard Ratio sẽ là công cụ để đánh giá tính trực giao của cơ sở. Ta chạy chương trình sinh ra ma trận có số chiều tương đương với tập tin mà ta cần truyền đi, tạm kí hiệu là n. Mỗi lần sinh ra một ma trận ta lại tính toán Hadamard Ratio của ma trận đó, nếu đủ tốt ta sẽ dừng lại. Tất nhiên việc sinh ra ma trận trực giao (H = 1) là điều không nhất thiết phải có bởi nhiều mạng Lattice chưa chắc đã chứa trong mình một cơ sở trực giao. Chúng tôi khuyến nghị H nên > 0,9 [47] để đảm bảo cho quá trình giải mã nhận được kết quả chính xác. Kết thúc quá trình ta có được một ma trận với H > 0,9, tạm gọi là ma trận V, nó được chọn làm khóa bí mật.
Từ khóa bí mật ta tìm khóa công khai bằng cách nhân nó với một ma trận đơn phương. Việc ta cần làm tiếp theo là chạy chương trình sinh ra ma trận đơn phương. Với mỗi một ma trận đơn phương được sinh ra, ta lấy nó nhân với khóa bí mật thu được một ma trận khác. Ta lại tính Hadamard Ratio của nó, do khóa công khai có tính trực giao càng thấp càng tốt nên chúng tôi khuyến nghị H < 0,001 [47]. Khi ta tìm được ma trận có H đủ nhỏ, tạm gọi là ma trận W, nó được chọn làm khóa công khai.
Mấu chốt là việc sinh ra liên tục ma trận đơn phương. Ta hiểu rằng ma trận đơn phương tạm gọi là U là ma trận có det(U) = ± 1, vậy cách làm là gì? Liệu có phải là cứ sinh liên tục ma trận M với n chiều rồi tính det(M), đến khi nào thỏa mãn det(U) = ± 1 thì dừng lại. Đúng, cách làm này không sai nhưng với bản tin bí mật đủ dài để cần một ma trận đơn phương với n = 100 thì việc sinh ra ma trận U dần trở thành việc may rủi ngay cả với các máy tính có cấu hình tốt để việc tính toán đủ nhanh, thậm chí chưa kể đến khi sinh ra U rồi nhưng chưa chắc W đã thỏa mãn H < 0,001. Chúng tôi đã từng thử với Google Colab (là dịch vụ đám mây miễn phí, có cung cấp GPU để triển khai chương trình viết bằng Python) để sinh ma trận M với n = 100 như trên và với 16 tiếng vẫn chưa ra kết quả. Vậy cách làm đúng đắn là gì? Chúng ta cần sinh ra hai ma trận thành phần của ma trận đơn phương, tạm gọi là ma trận tam giác trên và ma trận tam giác dưới. Ma trận tam giác trên thì tất cả các giá trị dưới đường chéo đều là 0, tương tự vậy với tam giác ma trận dưới. Sau đó ta nhân hai ma trận này với nhau thì sẽ thu được một ma trận đơn phương. Với ma trận đơn phương có n = 100 thì thời gian để sinh ra ma trận U chỉ là dưới 1s với Google Colab. Như vậy việc tạo khóa công khai có H thỏa mãn H < 0.001 là hoàn toàn khả thi kể cả với n lớn [47].
Kết thúc quá trình sinh khóa ta có được khóa bí mật V, khóa công khai W và ma trận đơn phương U.
24
Thuật toán Mã hóa: Bản tin truyền đi trước khi vào quá trình mã hóa cần được mã hóa trước thành một ma trận đơn phương với n phần tử số nguyên tương ứng với số ký tự của bản mã. Ta cần làm vậy để trong quá trình mã hóa ta có các phép tính toán với ma trận. Ta bắt đầu quá trình mã hóa với khóa công khai W đã được sinh ra. Một véctơ r được chọn ngẫu nhiên để làm nhiễu loạn, còn được gọi là khóa tạm thời. Véctơ r được chọn sao cho chiều dài của r ngắn hơn ½ chiều dài khoảng cách nhỏ nhất của 2 điểm bất kỳ thuộc mạng tinh thể L. Bởi khi đó chúng ta chắc chắn được việc đó là bản tin sau khi mã hóa, tạm gọi là bản mã e sẽ không thuộc mạng Lattice L.
e = Wm + r (12)
Ta cũng có thể dùng hash của bản rõ để gửi đi vì hash là mã hóa một chiều, từ bản hash ta không thể khôi phục về bản rõ. Việc gửi bản hash của bản rõ có tác dụng kiểm tra kết quả sau quá trình giải mã. Như vậy kết thúc quá trình mã hóa.
Thuật toán Giải mã: Ta nhận được bản mã e, khóa công khai W và đặc biệt là khóa bí mật V. Để giải mã ta sử dụng khóa bí mật và tìm véctơ gần nhất tạm gọi là véctơ v với bản mã e bằng thuật toán Babai. Công đoạn cuối cùng sau khi đã có véctơ v, ta tính toán theo công thức (13) thì bản mã sẽ được giải mã:
m = W-1v (13)
Sau đó ta có thể hash và kiểm tra giá trị hash nhận được với giá trị hash nhận được từ quá trình mã hóa.
Đánh giá: Một bên thứ ba muốn đánh cắp nội dung bản rõ được truyền đi
nhưng không biết khóa bí mật V do đã được giữ kín. Bên thứ ba muốn giải mã bản mã e thông qua khóa công khai W. Nhưng như ta đã biết khóa công khai W là khóa có tính trực giao rất thấp so với khóa bí mật V, do đó nếu dùng khóa công khai W và áp dụng thuật toán Babai để tìm véctơ gần nhất v thì kết quả sẽ rất xa so với kết quả chính xác. Từ đó mà kết quả sau quá trình giải mã đương nhiên là không chính xác so với bản rõ được truyền đi. Do vậy đương nhiên bản rõ được truyền đi một cách an toàn. Để hoàn thiện độ an toàn cho quá trình truyền bản rõ, việc lựa chọn véctơ gây nhiễu hay còn gọi là khóa tạm thời được diễn ra. Véctơ r không được phép quá nhỏ bởi nếu quá nhỏ thì việc giải mã khi sử dụng khóa công khai W sẽ không gặp thêm khó khăn. Tương tự nếu quá lớn thì việc giải mã khi sử dụng khóa bí mật V sẽ có kết quả không chính xác.