encryption - 为 16 位系统编写 RC4

标签 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 时犯错误。)

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

最佳答案

选项 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 之前/之后)

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

关于encryption - 为 16 位系统编写 RC4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147191/

相关文章:

assembly - arm-thumb指令集的blx指令如何支持4MB范围

assembly - 16 位程序集与 64 位 Windows 7 不兼容

java - Java 类型转换的奇怪输出

windows - 我可以在不使用密码的情况下检查加密的 zip 存档的内容吗?

java - DES密文长度在传输过程中减少且不是8字节的倍数

c - 如何在 C 中将无符号整数作为二进制值返回?

c++ - 如何使用高字节和低字节?

vb.net - 如何使用 RijndaelManaged 和 PKCS5 填充在 vb.net 中加密字符串?

c - 使用 "pushf"并弹出到 32 位寄存器是否会破坏堆栈?

assembly - objdump 输出中的 data16 是什么意思?