2012-04-13 3 views
2

DCPU-16用のRC4を作成していますが、始める前にいくつか質問があります。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 

S[]の各要素が代わりに期待0-255の、0から65535の範囲から行くことができますので、私は16ビット・ワードで働いていたよう。そしてKは0-65535である必要がありますが、この問題に対処するにはどうすればよいでしょうか?

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

  1. はまだ実行に時間がかかります(どこでもMod 255を使用し、連結2ラウンドで出力を移入し、私は可能な限り低く、私のCPBを維持したいです)
  2. 微調整RC4まだS[]のために長さ255の配列を使用して(私はRC4いじり間違いを犯す心配ですので、暗号権利をしたいながらそうKは、16ビットの数になります。)

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

+1

なぜ「AND 255」を使用しないのですか?これはほとんどのためのものです。 – harold

+3

*「私は暗号を正しいものにしたいので、RC4で間違いを覚えるのが心配です。」* - 心配しないで、あなたは間違いをするでしょう。たとえば、あなたの最善の努力にもかかわらず、私はあなたの最初のリリースが[timing side-channel attack](http://ja.wikipedia.org/wiki/Timing_attack)に苦しむことを保証します。あなたが何か重要なことにこれを実際に使用しているわけではないので、それはいいです - これは良い学習体験になります:) –

答えて

1

オプション2あなたは、この程度の速さ(私が何かを逃した場合を除き、16ビット・ワードあたり57サイクル)あなたは、このことを前提とし、それを作ることができるようになり

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 

を行うことができます

暗号弱いですSは、レジスタに格納されているしようと

(あなたは、コードの外にあるときにS前/後にそれらを格納することができます)静的(ARRの私のコードの値)とijですあなたが毎回それを開梱する必要があるので、アレイをパックするとすべてが遅くなります。

+0

小さな:(実際のコードを自分のものではなく、例で学ぶことは非常に良いツールです。 –

+0

"%256と同じ"という意味でしょうか? – harold

+0

@harold yeah fixed –

1

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

+0

もっと私はそれについてもっと私は同意します。方法1をやろうとしているので、この質問を2回削除/元に戻しました。あなたが答えなかったら削除してしまいました。 –