2

我正在为 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,处理这个问题的最佳方法是什么?

我看到的选项(及其问题)是:

  1. 仍然Mod 255在任何地方使用并用连接的两轮填充输出(运行时间更长,我想保持我的CPB尽可能低)
  2. 调整 RC4 所以K将是一个 16 位的数字,同时仍然使用长度为 255 的数组S[](我想做正确的加密,所以我担心在修补 RC4 时会出错。)

我最好的选择是什么?我觉得我可能必须做#1,但我希望这里的人们能给我灌输信心去做#3。

4

2 回答 2

1

我看不出问题,因为 DCPU16 有 16 位字。RC4 在mod 256密钥调度和 PRGA 中都运行(它的输出是字节流——同样,没有问题)。如果您的问题是节省空间,您可以使用一个单词来存储 的两个相邻单元格S,仅此而已。

于 2012-04-13T19:56:19.533 回答
1

选项 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当您在代码之外时)

trying to pack the array will make everything slower as you need to unpack it each time

于 2012-04-13T20:27:36.417 回答