gpt4 book ai didi

c - Delphi 和 C 中的 RC4?

转载 作者:太空狗 更新时间:2023-10-29 14:53:36 24 4
gpt4 key购买 nike

我已经设法将 RC4 实现从 PolarSSL 移植到 delphi,因为我需要在 2 个应用程序(C 和 Delphi)之间进行加密通信,但问题是,加密数据永远不一样,两种代码都会加密和解密数据自己成功,但不是对方加密的数据。

下面是两个代码:

C 代码(取自 PolarSSL)

typedef struct
{
int x; /*!< permutation index */
int y; /*!< permutation index */
unsigned char m[256]; /*!< permutation table */
}
arc4_context;

void arc4_setup(arc4_context *ctx, unsigned char *key, int keylen)
{
int i, j, k, a;
ctx->x = 0;
ctx->y = 0;
for( i = 0; i < 256; i++ ) ctx->m[i] = (unsigned char) i;
j = k = 0;
for( i = 0; i < 256; i++, k++ )
{
if( k >= keylen ) k = 0;
a = ctx->m[i];
j = ( j + a + key[k] ) & 0xFF;
ctx->m[i] = ctx->m[j];
ctx->m[j] = (unsigned char) a;
}
return;
}

void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen )
{
int i, x, y, a, b;
unsigned char m[256];

x = ctx->x;
y = ctx->y;

for (i = 0; i < 256; i++) m[i] = ctx->m[i];
for( i = 0; i < buflen; i++ )
{
x = ( x + 1 ) & 0xFF; a = m[x];
y = ( y + a ) & 0xFF; b = m[y];

m[x] = (unsigned char) b;
m[y] = (unsigned char) a;

buf[i] = (unsigned char)
( buf[i] ^ m[(unsigned char)( a + b )] );
}
return;
}

我的德尔福代码:

type
arc4_context = packed record
x, y: integer;
m: array[0..255] of byte;
end;

procedure arc4_setup(var ctx: arc4_context; key: PChar; keylen: Integer);
var
i, j, k, a: Integer;
begin
ctx.x := 0;
ctx.y := 0;
for i := 0 to 255 do ctx.m[i] := Byte(i);
j := 0;
k := 0;
for i := 0 to 255 do
begin
if (k >= keylen) then k := 0;
a := ctx.m[i];
j := (j + a + Byte(key[k])) and $FF;
ctx.m[i] := ctx.m[j];
ctx.m[j] := a;
Inc(k);
end;
end;


procedure arc4_crypt(ctx:arc4_context; var buf:string; buflen:integer);
var
i, x, y, a, b: Integer;
m: array [0..255] of byte;
begin
x := ctx.x;
y := ctx.y;
for i := 0 to 255 do m[i] := ctx.m[i];
i := 0;
while (i < buflen) do
begin
x := (x + 1) and $FF;
a := m[x];
y := (y + a) and $FF;
b := m[y];

m[x] := b;
m[y] := a;

buf[i+1] := Char(Byte(buf[i+1]) xor Byte(m[a + b]));
inc(i);
end
end;

最佳答案

我(终于)发现了这两个代码之间的区别。

Pascal 翻译的以下行是不正确的:

buf[i+1] := Char(Byte(buf[i+1]) xor Byte(m[a + b]));

C 版本如下:

buf[i] = (unsigned char) ( buf[i] ^ m[(unsigned char)( a + b )] );

请注意,a + b 被截断为单个 unsigned char,而上面的 Pascal 版本表示 m[a + b] 和所以 a + b 的索引可以超过 255。

您应该将此行翻译为:

buf[i+1] := chr(ord(buf[i+1]) xor ord(m[Byte(a+b)]));

我已经更改为使用 Chrord,它们是外观上的变化,但我觉得它们更干净。实质性的变化是在 m[Byte(a+b)] 中,我强制将 a+b 添加到字节数据类型的上下文中。

很明显,此错误会导致数组 m 的数组访问越界。如果您在启用范围检查的情况下运行,该错误会立即突出显示。我怎么强调 Delphi 的范围检查功能的值(value)都不为过。

关于c - Delphi 和 C 中的 RC4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6979103/

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