Lý lịch
Một miếng đệm một lần một là một hình thức mã hóa đã được chứng minh là không thể bẻ khóa nếu được sử dụng đúng cách.
Mã hóa được thực hiện bằng cách lấy một bản rõ (chỉ bao gồm các chữ cái AZ) và tạo ra một chuỗi ngẫu nhiên trên cùng một độ dài (cũng chỉ có các chữ cái). Chuỗi này đóng vai trò là chìa khóa. Mỗi ký tự trong bản rõ sau đó được ghép với ký tự tương ứng trong khóa. Bản mã được tính như sau: Đối với mỗi cặp, cả hai ký tự được chuyển đổi thành số (A = 0, B = 1, ... Z = 25). Hai số được thêm modulo 26. Số này được chuyển đổi trở lại thành một ký tự.
Giải mã hoàn toàn ngược lại. Các ký tự trong bản mã và khóa được ghép nối và chuyển đổi thành số. Sau đó, khóa được trừ khỏi modulo mã hóa 26 và kết quả được chuyển đổi thành ký tự AZ.
Các thách thức
Thách thức của bạn là viết chương trình ngắn nhất có thể vừa có thể mã hóa và giải mã một bảng đệm một lần.
Trên dòng đầu tiên (đến STDIN), sẽ có từ "ENCRYPT" hoặc từ "DECRYPT".
Nếu từ được mã hóa, thì dòng tiếp theo sẽ là bản rõ. Chương trình của bạn sẽ xuất hai dòng (sang STDOUT), dòng đầu tiên là khóa và dòng thứ hai là bản mã.
Nếu từ được giải mã, chương trình của bạn sẽ nhận được thêm hai dòng đầu vào. Dòng đầu tiên sẽ là khóa và dòng thứ hai sẽ là bản mã. Chương trình của bạn sẽ xuất ra một dòng, đây sẽ là bản rõ đã được giải mã.
Bản rõ, bản mã và khóa phải luôn bao gồm các chữ cái in hoa AZ. Chúng sẽ luôn là một dòng duy nhất và không chứa khoảng trắng.
Chìa khóa phải luôn luôn là ngẫu nhiên. Không có phần lớn của nó nên lặp lại giữa các lần chạy và không nên có các mẫu có thể tìm thấy trong văn bản.
Hai ví dụ đơn giản:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
Biểu >
thị dòng nào là đầu ra, vì vậy bạn không phải in biểu tượng đó làm đầu ra.
/dev/random
, haveged
), mã hóa bằng cách xé các quỹ đạo bằng các byte và giải mã bằng cách xé chúng bằng khóa. gist.github.com/5078264 khóa hoặc tính ngẫu nhiên có thể được đọc từ stdin, tin nhắn hoặc cyphertext có thể là một đối số tên tệp.
/dev/hwrng
, thay vì sử dụng giả ngẫu nhiên (về mặt kỹ thuật làm cho nó bị hỏng.)