Hàm băm mật mã (cryptographic hash function) như SHA-256 được thiết kế để không thể đảo ngược về mặt lý thuyết: biết h=SHA256(x), việc tìm lại x (tấn công tiền ảnh — preimage attack) là bất khả thi nếu không gian giá trị của x đủ lớn. Tuy nhiên, nếu x chỉ là một mã PIN gồm N chữ số (N≤6, tức không gian chỉ tối đa 106 giá trị), ta hoàn toàn có thể vét cạn (brute-force) toàn bộ khả năng trong thời gian ngắn — đây chính là lỗ hổng thường gặp khi hệ thống dùng PIN/OTP quá ngắn.
Một hệ thống lưu PIN dưới dạng h=SHA256(pin), trong đó pin là chuỗi N chữ số thập phân (có thể có số 0 ở đầu, ví dụ PIN 4 chữ số giá trị 7 được biểu diễn là 0007), và băm trên chuỗi ký tự biểu diễn PIN (không phải giá trị số nhị phân). Cho N và h (dạng hex thường, 64 ký tự), hãy tìm lại PIN gốc bằng cách vét cạn mọi giá trị PIN có thể từ "0"*N đến "9"*N.
Ví dụ: với N=1 và h= ef2d127de37b942baad06145e54b0c619a1f22327b2ebbcfbec78f5564afe39d thì PIN là 5 (vì hashlib.sha256(b"5").hexdigest() cho đúng giá trị h trên).
Dòng 1: số nguyên N (1≤N≤6) — số chữ số của PIN. Dòng 2: chuỗi hex 64 ký tự (chữ thường) là giá trị SHA-256 của PIN.
In ra một dòng duy nhất là PIN tìm được, dạng chuỗi đúng N chữ số (giữ nguyên số 0 ở đầu nếu có).
Ví dụ:
Đầu vào:
4
03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4
Đầu ra:
1234
Đầu vào:
4
f15cea39f11dc0371cfb9a4b7b1c38d5c636feb72d70e2759b0e505905ee9d01
Đầu ra:
0007
Đang tải editor...