首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为16位系统编写RC4

为16位系统编写RC4
EN

Stack Overflow用户
提问于 2012-04-13 19:33:14
回答 2查看 693关注 0票数 2

我正在为DCPU-16编写RC4,但是在开始之前我有一些问题要问。

RC4算法:

代码语言:javascript
复制
//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位的数字,而S[]仍然使用长度255的数组(我想做正确的加密,所以我担心在修改RC4时会出错)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-13 20:27:36

选项2将使加密变得更弱。

你可以做到

代码语言:javascript
复制
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之前/之后存储它们)。

尝试打包数组会使所有事情变得更慢,因为每次都需要解压它。

票数 1
EN

Stack Overflow用户

发布于 2012-04-13 19:56:19

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10147191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档