2012-04-13 6 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가되어야합니다.이 문제를 해결하기위한 가장 좋은 방법은 무엇입니까?

의 I 참조 옵션 (그리고 그 문제가) 있습니다

  1. 아직도 실행하는 데 시간이 더 걸릴 것입니다 (사방 Mod 255를 사용하여 연결된 두 개의 라운드 출력을 채우고 나는 가능한 한 낮게 내 CPB을 유지하려면 여전히 S[]에 대한 길이 255의 배열을 사용하는 동안)
  2. 조정할 RC4 그래서 K는 (내가 RC4 땜질 실수에 대한 걱정 바로 그래서 암호화를 수행 할 16 비트 숫자가 될 것입니다.)

최선의 선택 방법은 무엇입니까? # 1 할 필요가 있을지도 모르지만, 여기 사람들이 나를 위해 # 3 할 자신감을 심어 줄 수 있기를 바랍니다.

+1

왜 'AND 255'를 사용하지 않습니까? 이것은 꽤 많이 있습니다. – harold

+3

* "(나는 암호를 올바르게하고 싶기 때문에 RC4로 실수를하는 것이 걱정됩니다.") * - 걱정하지 마십시오. 실수를 할 것입니다. 예를 들어, 최선의 노력에도 불구하고, 첫 번째 릴리스가 [타이밍 측면 채널 공격] (http://en.wikipedia.org/wiki/Timing_attack)으로 고통받을 것이라는 점을 보장합니다. 중요한 것을 위해 실제로 이것을 사용하지 않으므로, 괜찮습니다. 이것은 좋은 학습 경험이 될 것입니다. :) –

답변

1

옵션이이 약 빨리 (내가 뭔가를 놓친하지 않는 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 후/이전 저장할 수 있습니다) 정적합니다 (편곡의 내 코드 값)과 ij입니다 배열을 압축하면 매번 포장을 풀어야하므로 모든 작업이 느려집니다.

+0

작은 : (실제 코드를 알아 내지 못하지만 예제를 통해 학습하는 것은 매우 좋은 도구입니다.) –

+0

"% 256과 (와) 똑같은"의미일까요? – harold

+0

@harold yeah fixed –

1

DCPU16에는 16 비트 단어가 있으므로 문제가 표시되지 않습니다. RC4는 키 스케쥴링과 PRGA 모두에서 mod 256으로 작동합니다 (출력은 바이트 스트림입니다. 다시 문제가 없습니다). 문제가 공간을 절약하는 경우 한 단어를 사용하여 인접한 두 개의 셀을 S으로 저장할 수는 있습니다. 것

+0

더 생각하면할수록 더 동의합니다. 이 질문을 두 번 삭제/삭제 취소 했으므로 방법 1을 수행 할 것이라고 확신합니다. 응답하지 않았다면 삭제했을 것입니다. –