Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Racket上实现RC4_C#_C++_Debugging_Racket_Rc4 Cipher - Fatal编程技术网

C# 在Racket上实现RC4

C# 在Racket上实现RC4,c#,c++,debugging,racket,rc4-cipher,C#,C++,Debugging,Racket,Rc4 Cipher,我正在尝试将我编写的RC4密码的C实现翻译成Racket语言 但是,它们产生不同的密钥流。我已经消除了错误编写关键调度阶段的可能性;这必须是正确的,因为它们产生相同的数组S。因此,我将重点放在寻找密钥流生成阶段的差异上 C: 球拍: (define (toret c) (set! i (unsafe-fxmodulo (add1 i) 256)) (set! j (unsafe-fxmodulo (add1 (Sr i)) 256)) (swap! (box (Sr i)

我正在尝试将我编写的RC4密码的C实现翻译成Racket语言

但是,它们产生不同的密钥流。我已经消除了错误编写关键调度阶段的可能性;这必须是正确的,因为它们产生相同的数组S。因此,我将重点放在寻找密钥流生成阶段的差异上

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))
交换定义为

(define (swap! ba bb)
  (define temp (unbox ba))
  (set-box! ba (unbox bb))
  (set-box! bb temp))
和Sr定义为define Sr x不安全字节ref S x

有什么区别?为什么这些函数产生不同的输出?在这两种情况下,i和j都初始化为0,S是相同的256字节数组。

(swap! (box (Sr i)) (box (Sr j)))
不会做你想做的事。它不会神奇地使sri和srj可变引用。交换!过程交换框中的内容——但框中包含的Sr i和Sr j是按值交换的,而不是按引用交换的

您需要做的是修改您的掉期!使用不安全字节集的过程!相反

下面是一些代码来说明我的观点:

#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"

有一个非常愚蠢的错误。设置j模加1 Sr i 256不等于j=j+S[i]%256;!在每条语句之后添加调试printf行非常有帮助。

在我的测试中确实有效。S是字节类型,而不是向量类型。无论如何,我发现了我的错误。@EricDong你发现了一个错误,而不是唯一的错误。您仍然需要重新制定您的交换!要使用不安全的字节集!;您对盒子的使用仍然不正确,导致交换失败!请不要弄错:你所有的S[x]=y;语句最终必须变成不安全的字节集!电话。使用盒子不能满足这个要求。这与C++标签有什么关系?
> (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"