2

私は 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 ~ 255 ではなく、0 ~ 65535 の範囲に収まります。K は 0 ~ 65535 である必要があります。この問題に対処するための最善の方法は何でしょうか?

私が見るオプション(およびそれらの問題)は次のとおりです。

  1. どこでも引き続き使用し、連結された 2 つのラウンドを出力に取り込みます (実行に時間がかかるため、 CPBをできるだけ低くMod 255保ちたいと考えています)。
  2. RC4 を微調整Kして、長さ 255 の配列を使用しながら 16 ビットの数値になるようにしS[]ます (暗号化を正しく行いたいので、RC4 をいじる際の間違いが心配です)。

私の最良の選択肢は何ですか?#1をしなければならないかもしれないと感じていますが、ここにいる人々が私に#3をする自信を与えてくれることを願っています.

4

2 に答える 2

1

DCPU16には16ビットワードがあるため、問題は発生しません。RC4はmod 256、鍵スケジュールとPRGAの両方で動作します(その出力はバイトのストリームです-繰り返しますが、問題はありません)。問題がスペースの節約である場合は、1つの単語を使用して、の2つの隣接するセルを格納できますがS、それだけです。

于 2012-04-13T19:56:19.533 に答える
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値)でiありj、レジスタに格納されていると想定しています(前後に格納できますSあなたがコードの外にいるとき)

アレイをパックしようとすると、毎回アンパックする必要があるため、すべてが遅くなります

于 2012-04-13T20:27:36.417 に答える