gpt4 book ai didi

c# - 在 Racket 上实现 RC4

转载 作者:太空宇宙 更新时间:2023-11-04 14:02:24 24 4
gpt4 key购买 nike

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

但是,他们正在生成不同的 key 流。我已经消除了错误编写 key 调度阶段的可能性;这必须是正确的,因为它们会产生相同的数组 S。因此,我专注于寻找 key 流生成阶段的差异。

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;
}

Racket :

(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))

有什么区别?为什么这些函数会产生不同的输出?在这两种情况下,ij 都被初始化为 0,并且 S 是一个相同的 256 字节数组。

最佳答案

线

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

关于c# - 在 Racket 上实现 RC4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18675705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com