1.5. Thuật toán rút gọn lattice¶
1.5.1. Thuật toán rút gọn lattice Gauss¶
Gọi \(L \subset \mathbb{R}^2\) là lattice \(2\) chiều với các vector cơ sở là \(\bm{v}_1\) và \(\bm{v}_2\). Thuật toán rút gọn lattice Gauss (Gaussian Lattice Reduction) hoạt động như sau.
Thuật toán 1.2 (Thuật toán rút gọn lattice Gauss)
- Loop
Nếu \(\lVert \bm{v}_2 \rVert < \lVert \bm{v}_1 \rVert\) thì đổi chỗ \(\bm{v}_1\) và \(\bm{v}_2\) (swap).
Tính \(m = \left\lfloor\dfrac{\bm{v}_1 \cdot \bm{v}_2}{\lVert \bm{v}_1 \rVert^2}\right\rceil\).
Nếu \(m = 0\) thì trả về cơ sở mới gồm các vector \(\bm{v}_1\) và \(\bm{v}_2\).
Thay \(\bm{v}_2\) thành \(\bm{v}_2 - m \bm{v}_1\).
Tiếp tục loop :)))
Sau khi thuật toán kết thúc thì \(\bm{v}_1\) là vector khác không ngắn nhất trong \(L\), và do đó bài toán \(\texttt{SVP}\) được giải quyết. Hơn nữa góc \(\theta\) giữa \(\bm{v}_1\) và \(\bm{v}_2\) thỏa mãn
cụ thể là \(\dfrac{\pi}{3} \leqslant \theta \leqslant \dfrac{2\pi}{3}\).
Chứng minh
Đầu tiên ta chứng minh \(\bm{v}_1\) là vector khác không ngắn nhất trong \(L\).
Giả sử thuật toán kết thúc và trả về hai vector \(\bm{v}_1\) và \(\bm{v}_2\). Bước 1 của vòng lặp đảm bảo rằng \(\lVert \bm{v}_2 \rVert \geqslant \lVert \bm{v}_1 \rVert\) và
vì đây là điều kiện để làm tròn \(\dfrac{\bm{v}_1 \cdot \bm{v}_2}{\lVert \bm{v}_1 \rVert^2}\) thành \(0\) và thỏa bước 3.
Mỗi vector \(\bm{v}\) khác không trong \(L\) đều biểu diễn được dưới dạng
Sử dụng (1.4) và bất đẳng thức quen thuộc \(\lvert x \rvert \geqslant -x\) với mọi \(x \in \mathbb{R}\) ta có
Ta sử dụng bất đẳng thức quen thuộc: với mọi \(t_1, t_2 \in \mathbb{R}\) thì
Biểu thức bằng \(0\) khi và chỉ khi \(t_1 = t_2 = 0\). Vì \(a_1\) và \(a_2\) là các số nguyên không đồng thời bằng \(0\) nên có thể suy ra \(\lVert\bm{v}\rVert^2 \geqslant \lVert\bm{v}_1\rVert^2\) với mọi vector \(\bm{v}\) khác không trong \(L\). Nói cách khác, \(\bm{v}_1\) là vector khác không ngắn nhất trong \(L\) và bài toán \(\texttt{SVP}\) được giải xong.
Tiếp theo, với \(\cos\theta\), ta có
Hơn nữa \(\lVert \bm{v}_2 \rVert \geqslant \lVert \bm{v}_1 \rVert\) nên suy ra
Mình sẽ ví dụ thuật toán trên qua việc phá mã congruential public key cryptosystem với số liệu đã trình bày trong bài viết.
Số nguyên tố \(q = 3973659461\) là public parameter.
Ta đã chọn \(f = 36624\) và \(g = 33577\) làm private key. Ở đây \(f\) và \(g\) điều kiện
Lúc này public key là
Để ý rằng \(h = f^{-1} g \pmod q\), tương đương \(fh + kq = g\) với \(k \in \mathbb{Z}\).
Ta thấy rằng \(f \cdot (h, 1) + k \cdot (q, 0) = (g, f)\). Như vậy cơ sở của lattice gồm hai vector
Điều kiện của \(f\) và \(g\) cho ta tính chất quan trọng: vector \((g, f)\) ngắn trong lattice. Do đó thuật toán rút gọn lattice Gauss sẽ hoạt động trong trường hợp này (số chiều bằng \(2\)).
Đặt \(\bm{v}_1 = (h, 1) = (3540857813, 1)\) và \(\bm{v}_2 = (q, 0) = (3973659461, 0)\).
Bước 1, ta có
nên ta giữ nguyên \(\bm{v}_1\) và \(\bm{v}_2\).
Tiếp theo ta tính
nên ta thay \(\bm{v}_2\) bởi \(\bm{v}_2 - m \bm{v}_1\) thì
Bước 2, hiện tại
nên
đổi chỗ \(\bm{v}_1\) và \(\bm{v}_2\) ta được
Tiếp theo ta tính
nên ta thay \(\bm{v}_2\) bởi \(\bm{v}_2 - m \bm{v}_1\) thì
Cứ tiếp tục như vậy, vector \(\bm{v}_1\), \(\bm{v}_2\) và giá trị \(m\) sau bước 3 ở mỗi vòng lặp sẽ được thể hiện ở bảng sau.
Loop |
\(\bm{v}_1\) |
\(\bm{v}_2\) |
\(m\) |
---|---|---|---|
1 |
\((3540857813, 1)\) |
\((3973659461, 0)\) |
\(1\) |
2 |
\((432801648, -1)\) |
\((3540857813, 1)\) |
\(8\) |
3 |
\((78444629, 9)\) |
\((432801648, -1)\) |
\(6\) |
4 |
\((-37866126, -55)\) |
\((78444629, 9)\) |
\(-2\) |
5 |
\((2712377, -101)\) |
\((-37866126, -55)\) |
\(-14\) |
6 |
\((107152, -1469)\) |
\((2712377, -101)\) |
\(25\) |
7 |
\((33577, 36624)\) |
\((107152, -1469)\) |
\(1\) |
8 |
\((33577, 36624)\) |
\((73575, -38093)\) |
\(0\) |
Vector \(\bm{v}_1\) ở bước cuối chính xác là \((g, f)\) bên trên.