Bài toán Học với lỗi (Learning With Errors — LWE) là nền tảng của nhiều chuẩn mật mã hậu lượng tử NIST (Kyber, Dilithium). Xét sơ đồ mã hoá khoá công khai thu nhỏ của Regev cho 1 bit mỗi lần.
Khoá công khai gồm ma trận A∈Zqm×n (hàng Ai) và vector b=(b1,…,bm) với bi≡⟨Ai,s⟩+ei(modq) (s là khoá bí mật, ei nhiễu nhỏ — cho trước trực tiếp trong đề, không cần tính lại).
Mã hoá bit μ∈{0,1}: chọn một tập con chỉ số S⊆{1,…,m} (cho dưới dạng chuỗi bit độ dài m, ký tự 1 tại vị trí i nghĩa là i∈S), tính
a′=∑i∈SAimodq,b′=(∑i∈Sbi+μ⌊2q⌋)modq
Bản mã là (a′,b′).
Giải mã bằng khoá bí mật s: tính d=(b′−⟨a′,s⟩)modq, sau đó đưa d về đại diện đối xứng dc∈(−q/2,q/2] (nếu d>q/2 thì dc=d−q, ngược lại dc=d). Bit giải mã được là 0 nếu ∣dc∣<q/4, ngược lại là 1.
Cho A, b, s và T truy vấn mã hoá/giải mã (mỗi truy vấn gồm S và μ), với mỗi truy vấn hãy thực hiện mã hoá rồi giải mã ngay và in ra bit thu được.
Ví dụ
Input:
3 32 4
27 2 2 22
7 1 17
15 14 8
6 5 27
2 1 5
3 5 2
4
1111 0
0000 1
1010 1
0101 0
Output:
0
1
1
0
Dòng 1: ba số nguyên n,q,m (1≤n,m≤50, q≥4).
Dòng 2: m số nguyên b1,…,bm (0≤bi<q).
m dòng tiếp theo: mỗi dòng n số nguyên — hàng Ai (0≤Ai,j<q).
Dòng tiếp theo: n số nguyên — khoá bí mật s.
Dòng tiếp theo: số nguyên T (T≥0) — số truy vấn.
T dòng tiếp theo, mỗi dòng gồm chuỗi bit S độ dài m (0/1) và số nguyên μ∈{0,1}, cách nhau bởi dấu cách.
In ra T dòng, mỗi dòng là bit (0 hoặc 1) giải mã được của truy vấn tương ứng.
Ví dụ:
Đầu vào:
3 32 4
27 2 2 22
7 1 17
15 14 8
6 5 27
2 1 5
3 5 2
4
1111 0
0000 1
1010 1
0101 0
Đầu ra:
0
1
1
0
Đầu vào:
2 16 1
6
8 3
4 2
2
1 1
1 0
Đầu ra:
1
0
Đang tải editor...