一个delphi7的加密算法 delphi xe5中解密出现中文乱码,请大牛们帮忙改改,谢谢 问题应该出在D7和XE5的字符处理上. D7默认是A 码,XE5默认 U码. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 汉字转换ASC的时候应该是双字节,在XE5里面跟踪看了下,加密后变成了单字节保存,所以也导致了解密变成了乱码,其实只有半个字节,转换不成汉字,字母大小写和数字转换都是对的。怎么改具体还要再看下。 unit ReCode;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,AnsiStrings;Function JiaMi(Src:String; Key:String):String;Function JieMi(Src:String; Key:String):String;implementationFunction 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]); 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; SrcAnsi:PAnsiChar; IntTemp,i:Integer; ByteArray: array of Byte;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; IntTemp:=Length(Src) div 2; setlength(ByteArray,IntTemp); i:=0; 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; ByteArray[i]:=TmpSrcAsc; i:=i+1; offset:=srcAsc; SrcPos:=SrcPos + 2; until SrcPos >= Length(Src); CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp); dest:=string(AnsiStrings.strpas(SrcAnsi)); Result:=Dest;end;end. 最近正好在做D7转XE5的工作,也正好把这方面的问题处理完,哈哈,给分吧~~ GetMem(SrcAnsi,IntTemp+1); '需要添加这句,不然会报错的CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp); 怎样不允许多个实例同时运行呢?? 如何控制WebBrowser控件的右键菜单的选项??? 如何在自定义组件里继承事件??? 紧急求助webbrowser的问题 我要用delphi编一个网络课件. modal窗口的终极研究啊 帮忙 OLAP和各位高手,再来看看好吗?????????? 讨论一下Delphi中AS的用法? 简单的打包问题??? 请问个位DELPHI高手? 谁有RemObjects Pascal Script 语法手册 求教基础语法问题
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;
implementationFunction 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]);
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;
SrcAnsi:PAnsiChar;
IntTemp,i:Integer;
ByteArray: array of Byte;
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;
IntTemp:=Length(Src) div 2;
setlength(ByteArray,IntTemp);
i:=0;
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;
ByteArray[i]:=TmpSrcAsc;
i:=i+1;
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp);
dest:=string(AnsiStrings.strpas(SrcAnsi));
Result:=Dest;end;end.
CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp);