为16位系统写RC4

时间:2012-04-13 19:33:14

标签: encryption assembly 16-bit dcpu-16 rc4-cipher

我正在为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。 )
  3. 我最好的选择是什么?我觉得我可能不得不做#1,但我希望这里的人能够让我有信心去做#3。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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值)和ij存储在寄存器中(当您在代码之外时,可以在S之前/之后存储它们)

尝试打包数组会使一切变慢,因为每次需要解压缩