我正在为 DCPU-16 编写 RC4,但是在开始之前我有一些问题。
RC4算法:
//KSA
for i from 0 to 255
S[i] := i
endfor
j := 0
for i from 0 to 255
j := (j + S[i] + key[i mod keylength]) mod 256
swap values of S[i] and S[j]
endfor
//PRGA
i := 0
j := 0
while GeneratingOutput:
i := (i + 1) mod 256
j := (j + S[i]) mod 256
swap values of S[i] and S[j]
K := S[(S[i] + S[j]) mod 256]
output K
endwhile
由于我正在处理 16 位字,因此 S[]
的每个元素的范围可以是 0-65535,而不是预期的 0-255。 K 需要为 0-65535,处理这个问题的最佳方法是什么?
我看到的选项(及其问题)是:
- 仍然在任何地方使用
Mod 255
并用两轮连接填充输出(运行时间会更长,我希望 CPB 尽可能低) - 调整 RC4,这样
K
将是一个 16 位数字,同时仍然使用长度为 255 的数组作为S[]
(我想正确进行加密,所以我担心在修改 RC4 时犯错误。)
我最好的选择是什么?我觉得我可能必须做#1,但我希望这里的人们能给我灌输信心去做#3。
最佳答案
选项 2 会使加密强度变弱
你可以做到
loop: add i,1 ;2 cycles
and i,0xff ;-- &0xff is the same as %256 ;2 cycles
add j,[i+arr];3 cycles
and j,0xff;3 cycles
set o,[j+arr];-- using overflow reg as swap var;2 cycles
set [j+arr],[i+arr];3 cycles
set [i+arr],o;2 cycles
set a,[i+arr];-- calc index;2 cycles
add a,[j+arr];3 cycles
and a,0xff;3 cycles
set b,[a+arr];2 cycles
;-- second octet
add i,1
and i,0xff
add j,[i+arr]
and j,0xff
set o,[j+arr]
set [j+arr],[i+arr]
set [i+arr],o
set a,[i+arr]
add a,[j+arr]
and a,0xff
shl b,8
bor b,[a+arr]
;--output b
set pc,loop
这大约是你能做到的最快速度(每个 16 位字 57 个周期,除非我错过了一些东西)这假设 S
是静态的(我代码中的 arr 值)并且 i
和 j
存储在寄存器中(当您在代码之外时,您可以将它们存储在 S
之前/之后)
尝试打包数组会使一切变慢,因为您每次都需要解包
关于encryption - 为 16 位系统编写 RC4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147191/