1.3. NTRU¶
Đối với NTRU-HRSS mình sử dụng bài thuyết trình ở dự án PQC của NIST [1].
Đối với NTRUEncrypt thì mình tham khảo [33] (chương 7 về lattice). Mình sẽ sử dụng kí hiệu từ tài liệu này làm chuẩn cho cả NTRUEncrypt, NTRU-HRSS và NTRU.
1.3.1. Tham số cho NTRU¶
Các thuật toán NTRU hoạt động dựa trên các vành thương (quotient ring) sau:
trong đó \(p\), \(q\) và \(n\) là các số nguyên tố khác nhau.
Ta cần định nghĩa một phép biến đổi gọi là center-lift. Trong các tài liệu khác thì gọi là phép modular reduction.
Với số nguyên \(n\) cố định đóng vai trò modulo, ta xét phần tử
Khi đó center-lift của \(r\) là số \(r' \in \mathbb{Z}\) sao cho \(-\dfrac{n}{2} < r' \leqslant \dfrac{n}{2}\) và \(r \equiv r' \pmod{n}\).
Ví dụ, khi \(n = 8\):
với \(r = 3\) thì \(r' = 3\);
với \(r = 6\) thì \(r' = -2\).
Ta cần thêm tập
1.3.2. NTRUEncrypt¶
1.3.2.1. Tạo khóa¶
Chọn \(f(x) \in \mathcal{T}(d+1, d)\) và \(g(x) \in \mathcal{T}(d, d)\) ngẫu nhiên.
Ta tính
Tiếp theo, tính
Khi đó, private key là cặp \((f(x), F_p(x))\) và public key là \(h(x)\).
1.3.2.2. Mã hóa¶
Giả sử bản rõ là đa thức \(m(x) \in R\) sao cho hệ số \(m_i\) thỏa \(-\dfrac{p}{2} < m_i \leqslant \dfrac{p}{2}\) (center-lift hệ số).
Chọn ngẫu nhiên đa thức \(r(x) \in \mathcal{T}(d, d)\) và tính
Khi đó bản mã là \(e(x) \in R_q\).
1.3.2.3. Giải mã¶
Để giải mã, ta tính
Sau đó ta center-lift các hệ số của \(a(x)\) thành đa thức thuộc \(R\) rồi tính trong modulo \(p\):
Khi đó \(b(x)\) chính là bản rõ \(m(x)\) ban đầu.
Ở đây, điều kiện của các tham số \(n\), \(p\), \(q\) và \(d\) để NTRUEncrypt hoạt động đúng là
1.3.2.4. Tính đúng đắn của quá trình giải mã¶
Ta có
vì \(f(x) \cdot F_q(x) \equiv 1 \pmod{q}\).
Xét đa thức \(p \cdot g(x) \cdot r(x) + f(x) \cdot m(x)\) trong \(R\) (center-lift). Ta có
1.3.2.5. NTRU lattice¶
Đặt public key
các hệ số đa thức tương ứng với vector
Đặt
ở đây \(\bm{I}_n\) là ma trận đơ đơn vị cấp \(n\), \(\bm{O}_n\) là ma trận không cấp \(n\).
Giả sử
tương ứng với các vector
Ta kí hiệu
Giả sử \(f(x) \cdot h(x) \equiv g(x) \pmod{q}\), đặt \(u(x) \in R\) là đa thức thỏa
Khi đó
nên vector \((\bm{f}, \bm{g})\) thuộc lattice \(L^{\text{NTRU}}_{\bm{h}}\).
1.3.3. NTRU-HRSS¶
Hệ mật mã NTRU-HRSS được nộp vòng 1 của dự án NIST PQC. Ở vòng 2, NTRU-HRSS hợp nhất với NTRUEncrypt trở thành NTRU.
1.3.3.1. Tạo khóa¶
Đối với NTRU-HRSS cần thêm các vành con của \(R_p\) và \(R_q\) xác định bằng đa thức cyclotomic. Ta kí hiệu đa thức cyclotomic thứ \(d\) là \(\Phi_d\). Nhận xét bên trên:
\(\Phi_1(x) = x - 1\);
nếu \(d\) là số nguyên tố thì
Đặt \(S_p = \dfrac{(\mathbb{Z} / p\mathbb{Z})[x]}{\Phi_n(x)}\) và \(S_q = \dfrac{(\mathbb{Z} / q\mathbb{Z})[x]}{\Phi_n(x)}\) với \(p\), \(q\) và \(n\) là các số nguyên tố như trên.
Hơn nữa, Khi \(n\) là số nguyên tố thì $x^n - 1 = Phi_1(x) Phi_n(x)$ và do đó
Thông thường ta chọn \(p = 3\) và \(n = 701\). Việc chọn \(n\) như vậy được (nhiều) người khẳng định là an toàn.
Đối với NTRU-HRSS-PKE, private key là một phần tử khác không \(f \in S_p\).
Từ \(f\) ta tính public key \(h = \Phi_1(x) \cdot g \cdot f^{-1} \in R_q\) với một phần tử \(g \in S_p\). Điều này đòi hỏi \(f\) khả nghịch trong \(R_q\).
Để hỗ trợ giải mã ta cần nghịch đảo của \(f\) trong \(S_p\). Ta viết nghịch đảo của \(f\) trong \(R_q\) và \(S_p\) tương ứng là là \(f^{-1}_q\) và \(f^{-1}_p\).
Theo cấu trúc thì \(f\) khả nghịch trong cả \(S_p\) và \(\mathcal{S}_q\).
Thay vì lấy \(f\) và \(g\) trực tiếp từ \(S_p\) thì ta lấy từ tập con:
Thuật toán sinh khóa gồm các bước:
\(f \gets \mathcal{T}^+\).
\(f^{-1}_p \gets f^{-1} \in S_p\).
\(f^{-1}_q \gets f^{-1} \in \mathcal{S}_q\).
\(g \gets \mathcal{T}^+\).
\(h = \Phi_1(x) \cdot g \cdot f^{-1} \in R_q\).
Trả về public key là \(\text{pk} = h\) và private key là \(\text{sk} = (f, f^{-1}_p)\).
1.3.3.2. Mã hóa¶
Gọi \(m \in S_p\) là encode của bản rõ và \(r \in S_p\) được chọn ngẫu nhiên.
Bản rõ \(e\) được tính:
Ở đây \(p = 3\) là số nguyên tố bên trên.
1.3.3.3. Giải mã¶
Input: \((e, (f, f^{-1}_3))\) và hai vành \((R_q, S_p)\).
Output: plaintext \(m'\):
Ở đây kí hiệu \([e \cdot f]_q\) nghĩa là phép tính diễn ra trong vành \(R_q\). Tương tự ở trên \([m]_3\) là encode của thông điệp \(m\) trong \(S_p\).