把Variant变成string在加密function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string; var I : integer; begin Result := ''; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; {******************************************************* * Standard Decryption algorithm - Copied from Borland * *******************************************************} function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string; var I : integer; begin Result := ''; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey; end; end; procedure TForm1.Button1Click(Sender: TObject); begin temp:=encrypt(memo1.Text,strtoint(edit1.Text),strtoint(edit2.Text),strtoint(edit3.Text)); memo2.Text:=temp; end;procedure TForm1.Button2Click(Sender: TObject); begin memo2.Text:=decrypt(temp,strtoint(edit1.Text),strtoint(edit2.Text),strtoint(edit3.Text)); end;
楼上的算法好像有问题? 你的E..与D..一样,就是分别调用E..与D..各一次后, 出来的明文与先前的InString不符合?{******************************************************* * Standard Decryption algorithm - Copied from Borland * *******************************************************}从Borland的哪个单元Copy的?想知道?望告知。
Variant是一种比较特殊的类型,其后面跟有一些元素,可以尝试对这些元素进行加密。 实在不行的话可以将Variant转化为一个字节流,然后对这些字节流进行加密procedure g_VariantTo(v: oleVariant; var ARec; Size: integer); var i: integer; p: PByteArray; prec: Pointer; begin prec := @ARec; p := VarArrayLock(v); for i:=0 to Size-1 do (PByteArray(prec))^[i] := p^[i]; VarArrayUnLock(v); {对字节流加密} .... end;
var
I : integer;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
end;
end;
{*******************************************************
* Standard Decryption algorithm - Copied from Borland *
*******************************************************}
function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : integer;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
temp:=encrypt(memo1.Text,strtoint(edit1.Text),strtoint(edit2.Text),strtoint(edit3.Text));
memo2.Text:=temp;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
memo2.Text:=decrypt(temp,strtoint(edit1.Text),strtoint(edit2.Text),strtoint(edit3.Text));
end;
你的E..与D..一样,就是分别调用E..与D..各一次后,
出来的明文与先前的InString不符合?{*******************************************************
* Standard Decryption algorithm - Copied from Borland *
*******************************************************}从Borland的哪个单元Copy的?想知道?望告知。
实在不行的话可以将Variant转化为一个字节流,然后对这些字节流进行加密procedure g_VariantTo(v: oleVariant; var ARec; Size: integer);
var
i: integer;
p: PByteArray;
prec: Pointer;
begin
prec := @ARec;
p := VarArrayLock(v);
for i:=0 to Size-1 do
(PByteArray(prec))^[i] := p^[i];
VarArrayUnLock(v);
{对字节流加密}
....
end;