Написание RC4 для 16-битной системы

Я пишу RC4 для DCPU-16, однако у меня есть несколько вопросов, прежде чем я начну.

Алгоритм 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 ответа

Решение

Вариант 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

это примерно так быстро, как вы можете сделать это (57 циклов на 16-битное слово, если я что-то пропустил), это предполагает, что S является статическим (значение arr в моем коде) и i а также j хранятся в регистрах (вы можете хранить их до / после S когда ты вне кода)

попытка упаковать массив сделает все медленнее, так как вам нужно каждый раз распаковывать его

Я не вижу проблемы, поскольку в DCPU16 есть 16-битные слова. RC4 работает в mod 256 как в ключевом планировании, так и в PRGA (его вывод - поток байтов - опять же, никаких проблем). Если ваша проблема заключается в экономии места, вы можете использовать одно слово для хранения двух соседних ячеек S, но это все.

Другие вопросы по тегам