2012-04-13 50 views
2

我正在为DCPU-16写入RC4,但在开始之前我有一些问题。为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-255从0-65535。而K需要为0-65535,那么处理这个问题的最佳方法是什么?

我看到的选项(和他们的问题)是:

  1. 还在用Mod 255到处填充级联两轮输出(需要更长的时间来运行,我想保持我的CPB尽可能低)
  2. 调整RC4所以K将是一个16位的数字,同时还使用长度为255的数组,S[](我想做的密码正确,所以我很担心犯错误与RC4修修补补。)

我最好的选择是什么?我觉得我可能不得不做第一名,但我希望这里的人能给我灌输信心让我做第三名。

+1

为什么不使用'AND 255'?这几乎是它的目的。 – harold 2012-04-13 20:12:24

+3

*“(我想做加密权利,所以我很担心在RC4中犯的错误)”* - 别担心,你会*犯错误。例如,尽管我们尽了最大的努力,但我保证您的第一个版本将遭受[时间偏向频道攻击](http://en.wikipedia.org/wiki/Timing_attack)。既然你实际上并没有使用它来做任何重要的事情,那很好 - 这将是一次很好的学习体验:) – 2012-04-13 20:20:05

回答

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后,他们之前存储/当你的代码外)

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

+0

一个小的:(为了弄清楚我自己的实际代码,但是通过实例学习是一个非常好的工具。 – 2012-04-13 20:38:13

+0

你可能意思是“与%256相同”,对吧? – harold 2012-04-13 21:15:19

+0

@harold yeah fixed – 2012-04-13 21:37:44

1

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

+0

我越想我越是认同。我删除/删除了这个问题两次,因为我确信我只是要做方法1.如果你没有回答,我会删除它。 – 2012-04-13 19:59:48