一个delphi7的加密算法 delphi xe5中解密出现中文乱码,请大牛们帮忙改改,多谢
一个delphi7的加密算法 delphi xe5中解密出现中文乱码,请大牛们帮忙改改,谢谢
这个是delphi7的加密解密算法,用着没问题,但是在delphi xe5中使用时,解密出来的汉字全是乱码,麻烦达人们帮忙改一改,感激不尽!在必要的地方注释一下,这代码我看着不是很懂,所以自己改不了,谢谢
------解决方案--------------------
问题应该出在D7和XE5的字符处理上. D7默认是A 码,XE5默认 U码.
------解决方案--------------------
unit ReCode;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
Function JiaMi(Src:String; Key:String):String;
Function JieMi(Src:String; Key:String):String;
implementation
Function JiaMi(Src:String; Key:String):String;
var
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :String;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
begin
KeyLen:=Length(Key);
KeyPos:=0;
Range:=1;
Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Src) do
begin
SrcAsc:=(Ord(Src[SrcPos]) + offset) MOD 255;
if KeyPos < KeyLen then KeyPos:= KeyPos + 1 else KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest:=dest + format('%1.2x',[SrcAsc]);
offset:=SrcAsc;
end;
Result:=Dest;
end;
//解密函数
Function JieMi (Src:String; Key:String):String;
var
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :String;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='starlin';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=1;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
try
SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
except
SrcAsc:=StrToInt('$00');
end;
if KeyPos < KeyLen Then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest := dest + chr(TmpSrcAsc);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
Result:=Dest;
Result:=Copy(Result,1,Length(Result)-1);
end;
end.
这个是delphi7的加密解密算法,用着没问题,但是在delphi xe5中使用时,解密出来的汉字全是乱码,麻烦达人们帮忙改一改,感激不尽!在必要的地方注释一下,这代码我看着不是很懂,所以自己改不了,谢谢
------解决方案--------------------
问题应该出在D7和XE5的字符处理上. D7默认是A 码,XE5默认 U码.
------解决方案--------------------
unit ReCode;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,AnsiStrings;
Function JiaMi(Src:String; Key:String):String;
Function JieMi(Src:String; Key:String):String;
implementation
Function JiaMi(Src:String; Key:String):String;
var
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :String;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
IntTemp:integer;
SrcAnsi:PAnsiChar;
begin
KeyLen:=Length(Key);
KeyPos:=0;
Range:=1;
Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
SrcAnsi:=PAnsiChar(AnsiString(Src));
IntTemp:= Length(SrcAnsi);
for SrcPos := 1 to IntTemp do
begin
SrcAsc:=(Ord(SrcAnsi[SrcPos-1]) + offset) MOD 255;
if KeyPos < KeyLen then KeyPos:= KeyPos + 1 else KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest:=dest + format('%1.2x',[SrcAsc]);