function EncryptString(Source:String;bEncrypt:Boolean=True; Key: String='delphi'):string;//加密解密字符串,加密后得字符串为16进制
//对字符串加密(Source:源 Key:密匙)
//对字符串解密(Src:源 Key:密匙) 加密得字符串如果没有解密时会报错
var KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
TmpSrcAsc :Integer;
begin
if bEncrypt then
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='delphi';
KeyPos:=0;
Range:=256;
Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Source) do
begin
SrcAsc:=(Ord(Source[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
else
begin
if Length(Source)<3 then
begin
Result:='';
Exit;
end;
KeyLen:=Length(Key);
if KeyLen = 0 then key:='delphi';
KeyPos:=0;
offset:=StrToInt('$'+ copy(Source,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(Source,SrcPos,2));
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(Source);
Result:=Dest;
end;
end;
逻辑已经清楚,但是我解析有问题?delphi没接触过不是特别明白!
这是我写的 C#的有问题!
private string Decress(string strpwd)
{
string result = string.Empty;
string key = "delphi";
int offset = 0;
int srcpos = 0;
int srcasc = 0;
int keypos = 0;
int rempsrcasc = 0;
if (strpwd.Length < 3)
{
result = string.Empty;
}
else
{
//F0461D3CA
offset = Convert.ToInt32("0x" + strpwd.Substring(0, 2), 16);
srcpos = 3;
do
{
srcasc = Convert.ToInt32("0x" + strpwd.Substring(srcpos - 1, 2), 16);
if (keypos < key.Length)
keypos += 1;
else
keypos = 1;
rempsrcasc = srcasc ^ (int)key[keypos];
if (rempsrcasc <= offset)
rempsrcasc = 255 + rempsrcasc - offset;
else
rempsrcasc -= offset;
result += Chr(rempsrcasc);
offset = srcasc;
srcpos += 2; } while (srcpos < strpwd.Length);
}
return result; }
//对字符串加密(Source:源 Key:密匙)
//对字符串解密(Src:源 Key:密匙) 加密得字符串如果没有解密时会报错
var KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
TmpSrcAsc :Integer;
begin
if bEncrypt then
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='delphi';
KeyPos:=0;
Range:=256;
Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Source) do
begin
SrcAsc:=(Ord(Source[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
else
begin
if Length(Source)<3 then
begin
Result:='';
Exit;
end;
KeyLen:=Length(Key);
if KeyLen = 0 then key:='delphi';
KeyPos:=0;
offset:=StrToInt('$'+ copy(Source,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(Source,SrcPos,2));
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(Source);
Result:=Dest;
end;
end;
逻辑已经清楚,但是我解析有问题?delphi没接触过不是特别明白!
这是我写的 C#的有问题!
private string Decress(string strpwd)
{
string result = string.Empty;
string key = "delphi";
int offset = 0;
int srcpos = 0;
int srcasc = 0;
int keypos = 0;
int rempsrcasc = 0;
if (strpwd.Length < 3)
{
result = string.Empty;
}
else
{
//F0461D3CA
offset = Convert.ToInt32("0x" + strpwd.Substring(0, 2), 16);
srcpos = 3;
do
{
srcasc = Convert.ToInt32("0x" + strpwd.Substring(srcpos - 1, 2), 16);
if (keypos < key.Length)
keypos += 1;
else
keypos = 1;
rempsrcasc = srcasc ^ (int)key[keypos];
if (rempsrcasc <= offset)
rempsrcasc = 255 + rempsrcasc - offset;
else
rempsrcasc -= offset;
result += Chr(rempsrcasc);
offset = srcasc;
srcpos += 2; } while (srcpos < strpwd.Length);
}
return result; }
问下 Source="FDA"时 copy(Source,3,2)delphi会有异常吗?
copy(Source,3,2)指从source的第三个开始连续取两个
你这个结果第三个字符是A,不可能取两个啊
所以我问有没有异常,有的话 那delphi是如何处理的?
就是解密不对,
Source="FDA"时
copy(Source,3,2)——》 C# Source.SubString(2,2)肯定异常这里delphi是如何处理的
我不明白……
莫非要转到delphi去问?
莫非要转到delphi去问?
你不会连substring也忘了怎么用了吧
这个跟delphi的copy不一样的
Source.SubString(2,2)是指从“A”开始取两个,必定出错啊
copy(Source,3,2)从第3位开始取2位
C#中的Source.SubString(2,2)也是从第3位开始取2位
如果strpwd长度为奇数,就循环到srcpos < strpwd.Length-1,最后一个字符单独处理;如果strpwd长度为偶数,那就照正常情况处理
看20层回复,DELPHI没问题,但是C#不能判断处理
keypos是delphi的索引是1开始的 这里改成keypos-1就OK了