2012-04-13 5 views
2

Ich schreibe RC4 für die DCPU-16, aber ich habe einige Fragen, bevor ich beginne.Schreiben RC4 für ein 16-Bit-System

RC4-Algorithmus:

//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 

Als ich mit 16-Bit-Worten arbeite, so dass jedes Element von S[] aus einem Bereich von 0 bis 65.535 geht, statt dem erwarteten 0-255. Und K muss 0-65535 sein, was wäre der beste Ansatz, um mit diesem Problem umzugehen?

Die Optionen I (und ihre Probleme) zu sehen sind:

  1. Noch Mod 255 überall verwenden und die Ausgabe mit zwei Runden verkettet (wird länger dauern, bevölkern zu laufen und ich möchte, dass meine CPB so gering wie möglich halten)
  2. Tweak RC4 so wird K eine 16-Bit-Zahl sein, während immer noch eine Reihe von Länge 255 für S[] (ich tun möchte, das Krypto-Recht so bin ich besorgt über Fehler zu machen bastelt mit RC4 verwenden.)

Was ist meine beste Option? Ich habe das Gefühl, dass ich das erste Mal tun muss, aber ich hoffe, dass die Leute hier Vertrauen schaffen können, um # 3 zu machen.

+1

Warum nicht 'AND 255' verwenden? Das ist ziemlich genau das, wofür es ist. – harold

+3

* "(Ich möchte das Crypto richtig machen, also mache ich mir Sorgen um Fehler, die an RC4 herumgebastelt werden)" * - Mach dir keine Sorgen, du * wirst * Fehler machen. Zum Beispiel, trotz deiner besten Bemühungen, garantiere ich, dass deine erste Veröffentlichung unter einem [Timing side-channel attack] leidet (http://en.wikipedia.org/wiki/Timing_attack). Da Sie dies eigentlich nicht für etwas Wichtiges verwenden, ist das in Ordnung - das wird eine gute Lernerfahrung sein. –

Antwort

1

Option 2 wird die Verschlüsselung schwächer

Sie

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 

das ist etwa so schnell wie Sie es machen können, können Sie machen (57 Zyklen pro 16-Bit-Wort, wenn ich etwas verpasst) setzt dies voraus, dass S ist statisch (der arr Wert in meinem Code) und i und j sind Speicher in den Registern (Sie können sie speichern, bevor/nach S, wenn Sie außerhalb des Codes sind)

versuchen zu packen das Array wird alles langsamer machen, da Sie es jedes Mal entpacken müssen

+0

Eine kleine :(für nicht herauszufinden, der eigentliche Code mein Selbst, aber Lernen mit gutem Beispiel ist ein sehr gutes Werkzeug. –

+0

Sie wahrscheinlich "das gleiche wie% 256", richtig? – harold

+0

@harold ja behoben –

1

Ich sehe das Problem nicht, da die DCPU16 16-Bit-Wörter hat. RC4 arbeitet in sowohl in der Schlüsselplanung als auch im PRGA (seine Ausgabe ist ein Strom von Bytes - wieder keine Probleme). Wenn Ihr Problem Speicherplatz spart, können Sie ein einzelnes Wort verwenden, um zwei benachbarte Zellen von S zu speichern, aber das ist es.

+0

Je mehr ich darüber nachdenke, desto mehr stimme ich zu. Ich habe diese Frage zweimal gelöscht/gelöscht, weil ich sicher bin, dass ich Methode 1 tun werde. Ich hätte sie gelöscht, wenn Sie nicht geantwortet hätten. –