Các mật mã VIC là một trong những thuật toán mã hóa bút chì và giấy phức tạp nhất từng được phát minh ra. Được sử dụng vào những năm 1950 bởi điệp viên Liên Xô Reino Häyhänen, tên mã là "VICTOR", nguyên tắc chính của nó là bảo mật thông qua obfuscation; một nhiều obfuscation.
Nhiệm vụ của bạn là viết một chương trình hoặc chức năng sẽ nhận một tin nhắn và mã hóa nó bằng mật mã VIC. Tôi cũng đã đăng một thử thách giải mã mật mã VIC ở đây . Nếu bất kỳ hướng dẫn nào sau đây không rõ ràng, đừng ngần ngại hỏi về chúng trong các bình luận. Các hướng dẫn được điều chỉnh từ trang web này .
Mã hóa mật mã VIC
Sự chuẩn bị
Bạn sẽ cần năm đầu vào:
- tin nhắn văn bản
- một từ khóa ngắn hoặc cụm từ chứa các chữ cái phổ biến nhất trong ngôn ngữ của bạn
- một cụm từ chính, chẳng hạn như một trích dẫn hoặc một dòng từ một bài hát (ít nhất 20 ký tự)
- một ngày (hoặc một số khác có sáu chữ số trở lên)
- số đại lý cá nhân
Trong thực tế, bốn người cuối cùng nên được người gửi và người nhận thỏa thuận trước, bao gồm cả số đại lý của người gửi hoặc người nhận được sử dụng trong mã hóa.
Thông điệp ví dụ của tôi sẽ là: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
Chúng tôi sẽ mã hóa bằng tiếng Anh (mặc dù bạn có thể sử dụng bất kỳ ngôn ngữ và bảng chữ cái nào bạn thích) và các chữ cái phổ biến nhất trong bảng chữ cái tiếng Anh là A, E, I, N, O, R, S, T
. Tôi sẽ sử dụng từ khóa SENATORI
.
Cụm từ chính của tôi là một câu trích dẫn của Richard Feynman: "Nguyên tắc đầu tiên là bạn không được tự lừa mình - và bạn là người dễ bị lừa nhất".
Như một ngày, tôi sẽ sử dụng ngày 31 tháng 7 năm 2016 (theo định dạng 3172016
), đó là ngày tôi viết mô tả này.
Số cá nhân tôi đã chọn cho mình là 9
.
Tóm tắt các bước
- Lấy các khóa trung gian để sử dụng trong các bước sau.
- Xây dựng và áp dụng các bàn cờ kiểm tra.
- Xây dựng và áp dụng bảng chuyển vị đầu tiên.
- Xây dựng và áp dụng bảng chuyển vị thứ hai (bị phá vỡ).
- Hoàn thiện tin nhắn bằng cách chèn nhóm chỉ báo tin nhắn.
Cơ chế con
Hai điều nữa để giải thích trước khi chúng ta đi vào cốt lõi của vấn đề: các quá trình bổ sung chuỗi và tuần tự hóa.
Ngoài ra chuỗi, còn được gọi là trình tạo Fibonacci bị trễ, hoạt động bằng cách lấy một chuỗi chữ số bắt đầu, thêm hai chữ số đầu tiên mà không mang theo (thêm chúng lại với nhau sau đó mod 10
) và nối kết quả vào cuối. Ví dụ:
79081
7 + 9 = 6
790816
9 + 0 = 9
7908169
0 + 8 = 8
79081698
8 + 1 = 9
790816989
1 + 6 = 7
7908169897
... and so on
Tuần tự hóa về cơ bản là lấy một chuỗi các chữ cái hoặc chữ số và ghi nhãn chúng theo thứ tự chữ cái / số. Các bản sao được dán nhãn từ trái sang phải. Ví dụ:
E X A M P L E
0 # A
1 0 2 # Es
1 0 3 2 # L
1 0 4 3 2 # M
1 0 4 5 3 2 # P
1 6 0 4 5 3 2 # X
3 3 0 5 8 4 2 0 4 7 5 4 8 1
0 1 # 0s
0 1 2 # 1
0 3 1 2 # 2
4 5 0 3 1 2 # 3s
4 5 0 6 3 1 7 8 2 # 4s
4 5 0 9 6 3 1 7 10 8 2 # 5s
4 5 0 9 6 3 1 7 11 10 8 2 # 7
4 5 0 9 12 6 3 1 7 11 10 8 13 2 # 8s
Tôi sử dụng chỉ mục không ở đây, nhưng chỉ mục theo cách bạn muốn.
1. Khóa trung gian
Chia 20 chữ cái đầu tiên của cụm từ chính thành hai nhóm 10 và tuần tự hóa từng nhóm riêng lẻ, chúng tôi sẽ gọi S1
và S2
.
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
Chọn một định danh tin nhắn 5 chữ số ngẫu nhiên, M
(đây có thể là một trong những đầu vào nếu bạn thích):
M = 47921
Trừ, không vay (trừ mod 10
), năm chữ số đầu tiên của ngày chính 3172016
từ M
:
M 47921
date - 31720
= 16201
Chuỗi thêm kết quả cho đến khi bạn có mười chữ số:
1620178218
Thêm các chữ số này vào S1
, mà không mang hoặc mod 10
, để có được G
:
1620178218
S1 + 8201357946
G = 9821425154
Ở trên S2
, viết dãy 0123456789. Xác định vị trí từng chữ số G
trong dãy 0123456789 và thay thế bằng chữ số ngay bên dưới nó S2
. Kết quả là T
.
0123456789
S2 2603751489
G 9821425154
T 9806705657
Sử dụng chuỗi bổ sung để mở rộng T
đến 60 chữ số.
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
50 chữ số cuối cùng này, trong năm hàng mười chữ số mỗi chữ số, tạo thành U
khối.
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
Hai chữ số không bằng nhau cuối cùng của U
khối được thêm riêng vào số cá nhân của tác nhân để đưa ra độ rộng của hai lần chuyển vị p
và q
.
9 + 3 = 12 (p, chiều rộng chuyển vị thứ nhất) 9 + 4 = 13 (q, chiều rộng chuyển vị thứ hai)
Tuần tự hóa T
và sử dụng chuỗi này để sao chép các cột của U
khối, từ trên xuống dưới, vào một hàng chữ số mới , V
.
T 9806705657
seqT 9804612537
U 7863751124
5490262369
9392885958
2210634430
4316978734
V 69911 56837 12548 26533 30206 13947 72869 49804 84323 75924
Tuần tự hóa các p
chữ số đầu tiên để lấy khóa cho lần hoán vị đầu tiên K1
và các q
chữ số sau cho khóa thứ hai K2
.
First 12 6 9 9 1 1 5 6 8 3 7 1 2
K1 6 10 11 0 1 5 7 9 4 8 2 3
Next 13 5 4 8 2 6 5 3 3 3 0 2 0 6
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
Cuối cùng, tuần tự hóa hàng cuối cùng của U
khối cần lấy C
, các tiêu đề cột cho bảng kiểm tra đóng đai:
U5 4316978734
C 3105968724
2. Bàn cờ
Đầu tiên, tôi sẽ đưa ra bảng kiểm tra ví dụ của mình sau đó giải thích các nguyên tắc trong việc tạo ra nó theo cách đó:
3 1 0 5 9 6 8 7 2 4
S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #
Dòng chữ đầu tiên là từ khóa ngắn của chúng tôi SENATORI
. Từ khóa của bạn có thể là bất kỳ chuỗi nào mà không trùng lặp, nhưng vì nó xác định hàng trên cùng của bảng kiểm tra của bạn, hãy chọn một cách khôn ngoan. Phía trên từ khóa là C
và các hàng khác là phần còn lại của bảng chữ cái của bạn theo bất kỳ thứ tự nào bạn chọn. Trong trường hợp của tôi, tôi điền vào bảng kiểm tra với phần còn lại của bảng chữ cái Latinh, dấu chấm câu .
và dấu để phân định số #
. Về cơ bản, bàn cờ là một mật mã thay thế lạ mắt. Ví dụ: "E" sẽ được thay thế bằng 1
và "W" sẽ được thay thế bằng 27
.
Khi chúng tôi đã mã hóa tin nhắn văn bản gốc của mình bằng bảng kiểm tra này, nhưng trước tiên, chúng tôi cần làm cho phần đầu của tin nhắn của chúng tôi ít rõ ràng hơn bằng cách chia nó ở một vị trí ngẫu nhiên và làm cho nó trở thành chữ hoa. Để biểu thị sự khởi đầu ban đầu khác, chúng tôi sử dụng hai điểm dừng đầy đủ..
We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
trở thành
HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT
Chúng tôi mã hóa với bàn cờ, cho chúng tôi:
407020 1293124 496481 96 354114062831 416479869443442424 271 581
2173436481812124 95451 274059 22628 435024 232880 14818229
Nếu độ dài của tin nhắn không chia hết cho 5, chúng tôi sẽ thêm một số ký tự null để xóa tin nhắn. Tin nhắn của chúng tôi dài 109 chữ số, vì vậy tôi sẽ thêm một null: "4".
40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294
Lưu ý: Vì thông báo ví dụ của tôi không chứa số, tôi sẽ nói ở đây rằng bạn có thể chỉ định, giả sử, #3#
được mã hóa như 44344
ở đây.
3. Chuyển vị đầu tiên
Tạo bảng chuyển vị bằng cách viết K1
(từ phần Khóa trung gian) theo sau là thông báo được mã hóa từ bước trước đó, trong các hàng có cùng độ dài, bên dưới khóa:
K1 6 10 11 0 1 5 7 9 4 8 2 3
4 0 7 0 2 0 1 2 9 3 1 2
4 4 9 6 4 8 1 9 6 3 5 4
1 1 4 0 6 2 8 3 1 4 1 6
4 7 9 8 6 9 4 4 3 4 4 2
4 2 4 2 7 1 5 8 1 2 1 7
3 4 3 6 4 8 1 8 1 2 1 2
4 9 5 4 5 1 2 7 4 0 5 9
2 2 6 2 8 4 3 5 0 2 4 2
3 2 8 8 0 1 4 8 1 8 2 2
9 4
Lấy các cột được đánh số theo thứ tự số của chúng tôi nhận được:
060826428 246674580 151411542 246272922 961311401 082918141
4414434239 118451234 334422028 293488758 0417249224 794943568
4. Chuyển vị thứ hai
Sự hoán vị đầu tiên tương đối đơn giản. Điều này, tuy nhiên, là một chuyển vị bị gián đoạn. Mẫu phá vỡ được xác định bởi chiều rộng của bảng và khóa. Trong ví dụ của chúng tôi, chúng tôi có 110 chữ số và 13 cột, nghĩa là chúng tôi sẽ có 8 hàng đầy đủ và 6 hàng thừa. Chúng tôi bắt đầu điền vào hàng đầu tiên, nhưng dừng lại ở cột 0 và tiếp tục như sau:
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 stop at 0
2 4 6 6 7 4 5 8 0 1 continue in a triangle pattern
5 1 4 1 1 5 4 2 2 4 6
2 7 2 9 2 2 9 6 1 3 1 1
4 0 1 0 8 2 9 1 8 1 4 1 4 until the end
4 1 4 4 3 4 2 3 9 1 1 restart and stop at 1
8 4 5 1 2 3 4 3 3 4 4 2
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 restart and stop at 2
Sau đó, chúng tôi điền vào vài chỗ trống cuối cùng với các chữ số còn lại.
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 7 2 4 9
2 4 6 6 7 4 5 8 0 1 2 2 4
5 1 4 1 1 5 4 2 2 4 6 7 9
2 7 2 9 2 2 9 6 1 3 1 1 4
4 0 1 0 8 2 9 1 8 1 4 1 4
4 1 4 4 3 4 2 3 9 1 1 9 4
8 4 5 1 2 3 4 3 3 4 4 2 3
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 5 6 8
Bây giờ, chúng tôi đọc các cột theo chính xác như cách chúng tôi đã làm trong lần chuyển vị đầu tiên.
71431148 42711925 861904185 22614147 45499243 28261334 80218938
641701404 025244820 645224398 271283226 94944438 064214521
Và chia mọi thứ thành các nhóm 5 chữ số:
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521
5. Hoàn tất tin nhắn
Bước cuối cùng là chèn định danh tin nhắn ngẫu nhiên của chúng tôi 47921
vào chính thông điệp. Chữ số cuối cùng của ngày chính 6
cho biết khoảng cách nhóm nên đi từ cuối.
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521
Ghi chú cho thử thách này
- Bạn được cung cấp tối thiểu năm đầu vào: tin nhắn, từ khóa chữ cái, cụm từ chính, ngày tháng và số cá nhân. Bạn có thể bao gồm hai đầu vào bổ sung: số nhận dạng thông báo ngẫu nhiên và null cần thiết để xóa tin nhắn hoặc chức năng của bạn có thể tự tạo một số số ngẫu nhiên.
- Bạn có thể giả sử tất cả các đầu vào là hợp lệ, với số chữ số và chữ cái chính xác (số nhận dạng tin nhắn 5 chữ số, ít nhất 20 chữ số cho cụm từ khóa, v.v.). Bạn có thể cho rằng các chuỗi của bạn (tin nhắn và từ khóa) đã bị xóa hết dấu chấm câu và dấu cách trừ các chuỗi bạn cho phép trong phiên bản của mình và các số đó đã được phân định bằng ký hiệu số.
- Từ khóa đầu tiên không nên có các chữ cái trùng lặp trong đó và trong mã của bạn, bạn có thể cho rằng nó không bao giờ có các chữ cái trùng lặp.
- Ngôn ngữ bạn sử dụng để mã hóa không thành vấn đề, miễn là ngôn ngữ đó có từ trước, bảng chữ cái có từ trước và bạn chỉ định ngôn ngữ nào bạn sử dụng trong câu trả lời của mình.
- Bất cứ bảng chữ cái nào bạn sử dụng cho bàn cờ của bạn, bạn có thể thêm hoặc xóa các ký hiệu để bỏ bảng kiểm tra ra. Chỉ định những gì bạn sử dụng các ký hiệu đó cho (ví dụ: dấu chấm câu, ký hiệu "thông điệp bắt đầu" riêng biệt, ký hiệu cho các từ phổ biến). Bạn có thể từ bỏ hoàn toàn ký hiệu số và đánh vần các số hoặc bao gồm từng chữ số trong bảng kiểm tra, sử dụng vị trí có ký hiệu số cho một số khác. Vui lòng chỉ định bảng kiểm tra bạn đã sử dụng trong câu trả lời của bạn.
- Đầu ra phải là một chuỗi các nhóm năm chữ số được phân tách bằng dấu cách, một danh sách các số nguyên năm chữ số hoặc một cái gì đó tương tự.
- Tôi đã sử dụng chỉ mục không và
0123456789
trong ví dụ của tôi. Bạn có thể sử dụng lập chỉ mục 1 và1234567890
, hoặc một số hệ thống khác trong câu trả lời của bạn, miễn là bạn chỉ định những gì bạn đã sử dụng.
Dưới đây là một ví dụ thực hiện trên Ideone .
Đây là một bài viết dài và tôi đã viết hầu hết bằng tay, vì vậy nếu có bất kỳ phần khó hiểu nào trong bài đăng này hoặc lỗi trong việc đếm và chuyển đổi của tôi, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!
without borrowing
và without carrying
? Bạn có nghĩa là cộng và trừ mod 10
, tức là (6+7) mod 10 = 3
và (6-8) mod 10 = 8
?
adding the first two digits without adding
Bạn có nghĩa là mang?