Giao thức S/KEY dùng xích băm một chiều để xác thực nhiều lượt đăng nhập mà không cần truyền lại mật khẩu gốc qua mạng. Xuất phát từ một seed (chuỗi ASCII), ta định nghĩa x0= seed (mã hoá UTF-8 thành byte) và
xi=SHA-256(xi−1),i=1,…,n
(băm trên chuỗi byte thô, giống bài "Xích băm Lamport"). Máy chủ lưu thanh ghi xác thực ban đầu R=xn (dạng hex).
Người dùng thực hiện lần lượt m lượt đăng nhập, đánh số k=1,2,…,m. Ở lượt thứ k, người dùng gửi lên máy chủ một giá trị yk (chuỗi hex, cho trước ở input — có thể đúng hoặc sai). Máy chủ xác thực bằng cách kiểm tra
SHA-256(yk)=?R
(so sánh trên bytes: giải mã yk từ hex thành byte trước khi băm). Nếu khớp: in OK, đồng thời cập nhật R←yk (chuẩn hoá về chữ thường) để dùng làm chốt so sánh cho lượt xác thực kế tiếp. Nếu không khớp: in FAIL, và R giữ nguyên không đổi (không cập nhật).
Lưu ý: về bản chất mỗi yk hợp lệ chính là giá trị x ở bước liền trước chốt hiện tại trong xích băm (ví dụ lượt đăng nhập đầu tiên hợp lệ phải gửi y1=xn−1), nhưng bạn chỉ cần lập trình đúng quy tắc kiểm tra và cập nhật R ở trên, không cần biết trước thứ tự sử dụng của xích.
Cho seed, n và m giá trị y1,…,ym theo đúng thứ tự, hãy in ra kết quả (OK/FAIL) của từng lượt đăng nhập.
Gồm 3+m dòng:
m dòng, mỗi dòng là OK hoặc FAIL cho lượt đăng nhập tương ứng theo đúng thứ tự. Nếu m=0 thì không in gì.
Ví dụ:
Đầu vào:
s28seed
3
4
a1cc219803a808ee54fa4c77b6a327a5f2ac4be41680b0b2ca39534961ada057
6f353e0228f6a7e798ce585a0820077098ccb4efb82adc9463205c264aa121ca
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
73323873656564
Đầu ra:
OK
OK
FAIL
OK
Đầu vào:
anything
5
0
Đầu ra:
Đang tải editor...