Arrays 数组中递增字节的结转
我正在测试我们的加密被破解的难易程度(或者说更快)。加密密钥是字节数组(可以是任何可变长度)。因此,从一个填充了所有0的数组开始,我需要从第一个字节开始,每次递增一个字节。当任何字节达到其最大值并返回0时,数组中的下一个字节需要递增(结转) 如果数组是一个短的固定长度,这将很简单,但我不知道如何在可变数组长度中这样做 线程内声明的变量:Arrays 数组中递增字节的结转,arrays,delphi,Arrays,Delphi,我正在测试我们的加密被破解的难易程度(或者说更快)。加密密钥是字节数组(可以是任何可变长度)。因此,从一个填充了所有0的数组开始,我需要从第一个字节开始,每次递增一个字节。当任何字节达到其最大值并返回0时,数组中的下一个字节需要递增(结转) 如果数组是一个短的固定长度,这将很简单,但我不知道如何在可变数组长度中这样做 线程内声明的变量: FKey: array of Byte; 在每次线程迭代后,它调用此过程将密钥增加一个字节: procedure TCrackThread.NextKey;
FKey: array of Byte;
在每次线程迭代后,它调用此过程将密钥增加一个字节:
procedure TCrackThread.NextKey;
begin
//Increment first byte
//If max, reset to 0 and increment next byte
//Recursively check the same for each following byte in array
end;
如何在这个可变长度数组中递增(从第一个开始)字节并结转到下一个?此代码段将增加第一个元素,并将继续增加数组元素,只要它们是255。如果是,则将其重置为零。当条件未满足或指数达到最大值时,例程将立即停止
var
k: Integer;
...
if (Length(fKey) > 0) then begin
k := 0;
Inc(fKey[k]);
while (fKey[k] = 255) do begin
fKey[k] := 0;
Inc(k);
if (k >= Length(fKey)) then
break;
Inc(fKey[k]);
end;
end;
这将把数组254,0,0转换为0,1,0
如果希望进位在第一个增量之前波动,
此代码将执行以下操作:
procedure Next;
var
k: Integer;
carry: Boolean;
begin
if (Length(fKey) > 0) then begin
k := 0;
repeat
carry := (fKey[k] = 255);
if carry then begin
fKey[k] := 0;
Inc(k);
if (k >= Length(fKey)) then
break;
end
else
Inc(fKey[k]);
until not carry;
end;
end;
这将把255255,0转换成0,0,1。当我读代码时,254,0,0的数组将增加到0,1,0,而不是像我相信的那样,255,0,0wants@crefird,“增量第一字节”254->255。“如果最大,则重置为0并增加下一个字节”。我相信我的解释符合OP的要求。@crefird,阅读问题的第二句,逻辑似乎有点模糊。我用一个例子更新了答案,包括你的解释。这可以概括一点。如果结果<其中一个操作数,则应设置进位。然后发生了溢出。@Rudy,是的,我知道,或者只是在增量后检查零。我只是想在这个编译器标志打开时避免溢出RT错误。如果有人感兴趣的话,可以很容易地将其关闭。我做了一个速度比较,差别只有百分之几。为了实现真正的速度,几条装配线可以解决这个问题。请注意,如果您有一个8字节(64位)的密钥,并且每秒可以测试10亿个密钥,那么测试所有密钥组合将花费近585年的时间。如果您使用的是已知的加密方法,那么破解配置文件也是已知的;你可以直接查一下,而不是去测量。如果您使用的是您刚刚编好的加密,但您正在努力计数,那么您可能做了错误的加密。