2013-09-07 4 views
1

라켓 언어로 작성한 RC4 암호의 C# 구현을 변환하려고합니다.라켓에 RC4 구현

그러나 그들은 다른 키 스트림을 생성합니다. 나는 이미 키 스케쥴링 단계를 오판 할 가능성을 제거했다. 이는 동일한 배열 S을 생성하므로 정확해야합니다. 따라서 저는 키 스트림 생성 단계에서 차이점을 찾는 데 중점을 둡니다.

C 번호 :

public int Dencode (int c) 
{ 
    I = (I + 1) % 256; 
    J = (J + S [I]) % 256; 
    int tmp = S [I]; 
    S [I] = S [J]; 
    S [J] = tmp; 
    return S [(S[I] + S[J]) % 256]^c; 
} 

라켓 : swap

(define (toret c) 
    (set! i (unsafe-fxmodulo (add1 i) 256)) 
    (set! j (unsafe-fxmodulo (add1 (Sr i)) 256)) 
    (swap! (box (Sr i)) (box (Sr j))) 
    (bitwise-xor (Sr (unsafe-fxmodulo (+ (Sr i) (Sr j)) 256)) c)) 

(define (swap! ba bb) 
    (define temp (unbox ba)) 
    (set-box! ba (unbox bb)) 
    (set-box! bb temp)) 

(define (Sr x) (unsafe-bytes-ref S x)) 정의 Sr 정의.

차이점은 무엇입니까? 왜 이러한 기능이 다른 출력을 내고 있습니까? 두 경우 모두 ij은 0으로 초기화되고 S은 동일한 256 바이트 배열입니다.

+0

이것은 C++ 태그와 어떤 관련이 있습니까? –

답변

-1

. (set! j (unsafe-fxmodulo (add1 (Sr i)) 256))J = (J + S [I]) % 256;과 (와) 일치하지 않습니다! 각 문장 다음에 디버그 printf 행을 추가하면 많은 도움이되었습니다.

1

라인

(swap! (box (Sr i)) (box (Sr j))) 

당신이 무엇을 기대하지 않습니다. 그것은 마술처럼 (Sr i)(Sr j) 변경 참조를 만들지 않습니다. swap! 프로시 저는 상자의 내용을 서로 바꿉니다. 그러나 상자에는 참조가 아닌 (Sr i)(Sr j)이 값으로 포함됩니다.

swap! 절차를 수정하여 unsafe-bytes-set! 대신 사용하십시오.


다음은 내 지점을 입증하는 몇 가지 코드입니다 :

#lang racket 
(require racket/unsafe/ops) 

(define (box-swap! x y) 
    (define tmp (unbox x)) 
    (set-box! x (unbox y)) 
    (set-box! y tmp)) 

(define (wrong-swap! bs x y) 
    (box-swap! (box (unsafe-bytes-ref bs x)) 
      (box (unsafe-bytes-ref bs y)))) 

(define (right-swap! bs x y) 
    (define tmp (unsafe-bytes-ref bs x)) 
    (unsafe-bytes-set! bs x (unsafe-bytes-ref bs y)) 
    (unsafe-bytes-set! bs y tmp)) 

예 : 아주 바보 같은 오류가 발생했습니다

> (define bs (bytes 1 2 3 4 5 6)) 
> bs 
#"\1\2\3\4\5\6" 
> (wrong-swap! bs 0 5) 
> bs 
#"\1\2\3\4\5\6" 
> (right-swap! bs 0 5) 
> bs 
#"\6\2\3\4\5\1" 
+0

내 테스트마다 작동합니다. 'S'는'vector' 타입이 아닌'bytes' 타입입니다. 어쨌든, 나는 내 잘못을 발견했다. – user54609

+0

@EricDong 오류 만이 아니라 하나의 오류가 있습니다. 'unsafe-bytes-set! '을 사용하기 위해서 당신의'swap!'을 여전히 재구성 할 필요가있다; 당신의 박스 사용은 여전히 ​​부정확합니다 (그리고'swap!'호출을 효과적인 no-op로 바꿉니다). –

+0

실수를하지 말자. 모든'S [x] = y;'문은 마침내 unsafe-bytes-set! 상자를 사용하면 해당 요구 사항을 해결할 수 없습니다. –