实施一个CipherSaber加密程序,如下所述。指导原则:
- 以字节为单位的最小条目获胜。
- 但是,与规范高尔夫球规范不同的是,欢迎您发布有趣的条目,即使它们不是认真的高尔夫条目。
- 条目通常是一个程序,该程序从标准输入中获取纯文本,并将密文写入到标准输出中,并使用您喜欢的某种方式(由用户指定)来指定密钥。
- 但是,如果您希望将此作为一个过程来实现,那也很好。
- IV必须来自加密安全的伪随机数生成器。如果您的语言不支持,请选择其他语言。;-)
- 请不要使用任何特定于加密货币的库,系统调用或指令(上述PRNG除外)。当然,通用的低级按位运算也可以。
CipherSaber是RC4 / Arcfour的变体,因此我将先描述后者,然后再对CipherSaber进行更改。
0. RC4 / Arcfour
Arcfour在其他地方已完全指定,但出于完整性考虑,我将在此处进行描述。(如果互联网草稿与本说明存在任何差异,则前者为规范性。)
按键设定
设置两个数组S
和S2
,两个数组的长度均为256,其中k_1
是密钥的第一个字节,k_n
也是最后一个。
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
(S2
一次又一次地填充密钥的字节,直到所有256个字节都被填充。)
然后,初始化j
为0,并随机播放256次:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
这样就完成了密钥设置。该S2
阵列在这里不再使用,可以清理。
密码流生成
初始化i
和j
为0,则生成密钥流,如下所示:
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
加密/解密数据
- 要进行加密,请将密钥流输出与明文进行异或
- 要解密,请将密钥流输出与密文异或
1. CipherSaber
CipherSaber(这是我们在此问题中实现的)是RC4 / Arcfour的两种变体:
10字节IV /一次
加密消息时,应获得10个随机字节,例如via /dev/urandom
,并将其写入加密输出的前10个字节中。解密消息时,输入的前10个字节是用于加密消息的IV。
RC4 / Arcfour密钥设置阶段passphrase || IV
以密钥运行,其中passphrase
用户指定的密码短语IV
如上所述,||
是串联的。因此,使用“你好,世界!”的密码短语。IV的“ supercalif”(但是不太可能是:-P)将导致出现“ Hello,world!supercalif”键。
按键设置的多次迭代
为了帮助防止使WEP加密完全失效的漏洞,RC4密钥设置阶段的改组循环运行了用户指定的次数。的值j
应在两次迭代之间保留。
2.测试向量
这是一些您可以用来测试程序的测试向量。此外,吱吱作响的ossifrage还创建了一个CipherSaber加密和解密工具,可用于验证结果。
您只需要实现加密程序。您不需要提供解密程序,但是在使用正确的密钥通过正确实施的解密程序进行处理时,加密程序的输出必须正确地往返于原始输入。
urandom
如果您关心“获胜”,则可以制作一个使用的版本(如果愿意,可以使用单独的条目)。:-)