我正在尝试将我编写的 RC4 密码的 C# 实现翻译成 Racket 语言。
但是,它们正在生成不同的密钥流。我已经消除了在按键调度阶段写错的可能性;这必须是正确的,因为它们会产生相同的数组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;
}
球拍:
(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))
swap
定义为
(define (swap! ba bb)
(define temp (unbox ba))
(set-box! ba (unbox bb))
(set-box! bb temp))
并Sr
定义为(define (Sr x) (unsafe-bytes-ref S x))
。
有什么不同?为什么这些函数会产生不同的输出?在这两种情况下i
和j
都被初始化为 0,并且S
是一个完全相同的 256 字节数组。