Thực hiện một chương trình mã hóa CodesSaber , như được mô tả dưới đây. Hướng dẫn:
- Mục nhỏ nhất, tính bằng byte, thắng.
- Một mục thường sẽ là một chương trình lấy bản rõ từ đầu vào tiêu chuẩn và ghi bản mã vào đầu ra tiêu chuẩn, với khóa được chỉ định (bởi người dùng) theo cách bạn muốn.
- Tuy nhiên, nếu bạn muốn thực hiện điều này như một thủ tục, điều đó cũng tốt.
- IV phải đến từ một trình tạo số giả ngẫu nhiên an toàn bằng mật mã. Nếu ngôn ngữ của bạn không hỗ trợ điều đó, hãy chọn một ngôn ngữ khác. ;-)
- Vui lòng không sử dụng bất kỳ thư viện, cuộc gọi hệ thống hoặc hướng dẫn cụ thể nào về tiền điện tử (trừ PRNG, như quy định ở trên). Tất nhiên, các hoạt động bitwise cấp thấp chung là ổn.
CodesSaber là một biến thể của RC4 / Arcfour, vì vậy tôi sẽ bắt đầu bằng cách mô tả cái sau, sau đó những thay đổi mà CodesSaber thực hiện.
0. RC4 / Arcfour
Arcfour được chỉ định đầy đủ ở nơi khác , nhưng để hoàn thiện, tôi sẽ mô tả nó ở đây. (Trong trường hợp có bất kỳ sự khác biệt nào giữa dự thảo Internet và mô tả này, thì trước đây là quy định.)
Thiết lập khóa
Thiết lập hai mảng S
và S2
cả hai chiều dài 256, k_1
là byte đầu tiên của khóa và k_n
là byte cuối cùng.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
được lấp đầy với các byte của khóa, lặp đi lặp lại, cho đến khi tất cả 256 byte được lấp đầy.)
Sau đó, khởi tạo j
thành 0 và xáo trộn 256 lần:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Điều này hoàn thành thiết lập chính. Các S2
mảng không còn được sử dụng ở đây, và có thể được chà.
Tạo dòng mật mã
Khởi tạo i
và j
về 0, sau đó tạo luồng khóa như sau:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Mã hóa / giải mã dữ liệu
- Để mã hóa, XOR đầu ra dòng chính với bản rõ
- Để giải mã, XOR đầu ra dòng chính với bản mã
1. Mật mã
CodesSaber (đó là những gì chúng tôi đang thực hiện trong câu hỏi này) là một biến thể của RC4 / Arcfour theo hai cách:
IV 10 byte / nonce
Khi mã hóa tin nhắn, cần lấy 10 byte ngẫu nhiên, chẳng hạn như thông qua /dev/urandom
và được ghi vào 10 byte đầu tiên của đầu ra được mã hóa. Khi giải mã một tin nhắn, 10 byte đầu tiên của đầu vào là IV được sử dụng để mã hóa nó.
Giai đoạn thiết lập khóa RC4 / Arcfour được chạy với passphrase || IV
tư cách là khóa, trong đó passphrase
cụm mật khẩu do người dùng chỉ định, IV
như được mô tả ở trên và ||
được ghép nối. Vì vậy, một cụm mật khẩu của "Xin chào, thế giới!" và IV của "supercalif" (tuy nhiên không chắc là :-P) sẽ dẫn đến một khóa "Xin chào, thế giới! supercalif".
Nhiều lần lặp lại thiết lập khóa
Để giúp ngăn ngừa lỗ hổng khiến mã hóa WEP bị hỏng hoàn toàn, vòng lặp xáo trộn của giai đoạn thiết lập khóa của RC4 được chạy với số lần người dùng chỉ định. Giá trị của j
nên được giữ lại giữa các lần lặp.
2. Vectơ kiểm tra
Dưới đây là một số vectơ kiểm tra bạn có thể sử dụng để kiểm tra các chương trình của mình. Hơn nữa, ossifrage squeamish đã tạo ra một công cụ mã hóa & giải mã CodesSaber mà bạn có thể sử dụng để xác nhận kết quả của mình.
Bạn chỉ cần thực hiện chương trình mã hóa. Bạn không cần cung cấp chương trình giải mã, nhưng đầu ra của chương trình mã hóa của bạn phải làm tròn chính xác với đầu vào ban đầu khi được xử lý với chương trình giải mã được triển khai chính xác bằng khóa chính xác.
urandom
(có thể là một mục riêng nếu bạn muốn) nếu bạn quan tâm đến việc "chiến thắng". :-)