Encryption 为16位系统写入RC4

Encryption 为16位系统写入RC4,encryption,assembly,16-bit,dcpu-16,rc4-cipher,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:

我正在为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
    ,并用两轮串联的方式填充输出(运行时间会更长,我希望尽可能保持较低)
  • 调整RC4,使
    K
    为16位数字,同时仍为
    S[]
    使用长度为255的数组(我想正确加密,因此我担心在修补RC4时出错。)

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

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

    选项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
    之前/之后存储它们)


    尝试打包阵列会让一切都变慢,因为每次都需要解包

    我越想越同意。我删除/取消删除了两次这个问题,因为我确信我将只做方法1。如果您没有回答,我会删除它。为什么不使用
    和255
    ?这就是它的用途。”(我想正确地加密,所以我担心在修补RC4时会出错。”-别担心,你会出错的。例如,尽管您尽了最大的努力,我保证您的第一个版本将受到影响。因为你实际上没有在任何重要的事情上使用它,这很好-这将是一个很好的学习经验:)一个小:(因为我自己没有弄清楚实际的代码,但是通过示例学习是一个很好的工具。