改写了一个常用的DELPHI的加解密函数
DELPHI
//
Function EncrypKey (Src:String; Key:String):string;
var
idx :integer;
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:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
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 UncrypKey (Src:String; Key:String):string;
var
idx :integer;
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:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(src,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(Src);
Result:=Dest;
end;
.NET
public string EncrypKey(String Src, String Key)
{
int KeyLen, KeyPos, offset, SrcPos, SrcAsc, Range;
string dest;
KeyLen = Key.Length;
if (KeyLen < 0)
{
Key = "Think Space";
}
KeyPos = 0;
SrcPos = 0;
SrcAsc = 0;
Range = 256;
//取得随机数
Random rd = new Random();
offset = rd.Next(Range);
dest = offset.ToString("X2");
for (SrcPos = 1; SrcPos <= Src.Length; SrcPos++)
{
SrcAsc = (Src[SrcPos-1] + offset) % 255;
if (KeyPos < KeyLen)
{ KeyPos = KeyPos + 1; }
else
{ KeyPos = 1; }
SrcAsc = SrcAsc ^ Key[KeyPos-1];
dest = dest + SrcAsc.ToString("X2");
offset = SrcAsc;
}
return dest;
}
//解密函数
public string UncrypKey(String Src, String Key)
{
int KeyLen, KeyPos, offset, SrcPos, SrcAsc, TmpSrcAsc, Range;
string dest = "";
KeyLen = Key.Length;
if (KeyLen < 0)
{ Key = "Think Space"; }
KeyPos = 0;
SrcPos = 0;
SrcAsc = 0;
Range = 256;
offset = Convert.ToInt32(Src.Substring(0,2),16);
SrcPos = 2;
while (SrcPos < Src.Length)
{
SrcAsc = Convert.ToInt32(Src.Substring(SrcPos, 2),16);
if (KeyPos < KeyLen)
{ KeyPos = KeyPos + 1; }
else
{ KeyPos = 1; }
TmpSrcAsc = SrcAsc ^ Key[KeyPos-1];
if (TmpSrcAsc <= offset)
{ TmpSrcAsc = 255 + TmpSrcAsc - offset; }
else
{ TmpSrcAsc = TmpSrcAsc - offset; }
dest = dest + (char)TmpSrcAsc;
offset = SrcAsc;
SrcPos = SrcPos + 2;
}
return dest;
}
VB
又改了个VB 的,不支持中文,想要支持中文的话要另外处理
用chr(A&*256+B)就行,详细代码就不贴了.
/
Public Function EncrypKey(Src As String, Key As String) As String
Dim idx, KeyLen, KeyPos, offset As Integer
Dim dest As String
Dim SrcPos, SrcAsc, SrcAsc2, TmpSrcAsc, Range, min As Integer
Dim i As Integer
KeyLen = Len(Key)
If KeyLen = 0 Then
Key = "Think Space"
End If
KeyPos = 0
SrcPos = 0
SrcAsc = 0
Range = 256
min = 1
BZ = 1
''''''随机数
Randomize
offset = Int((Range - min + 1) * Rnd + min)
dest = Hex(offset)
''''''保证十六进制用二位表示
If Len(dest) = 1 Then
dest = "0" + dest
End If
For SrcPos = 1 To Len(Src)
If KeyPos < KeyLen Then
KeyPos = KeyPos + 1
Else
KeyPos = 1
End If
If Asc(Mid(Src, SrcPos, 1)) < 0 Then
'''''''''''''中文处理
Else
SrcAsc = (Asc(Mid(Src, SrcPos, 1)) + offset) Mod 255
SrcAsc = SrcAsc Xor Asc(keyk(KeyPos))
If Len(Hex(SrcAsc)) = 1 Then
lssrcasc = "0" + Hex(SrcAsc)
Else
lssrcasc = Hex(SrcAsc)
End If
dest = dest + lssrcasc
offset = SrcAsc
End If
Next
EncrypKey = dest
End Function
''''解密函数
Public Function UncrypKey(Src As String, Key As String) As String
Dim idx, KeyLen, KeyPos, offset As Integer
Dim dest As String
Dim SrcPos, SrcAsc, TmpSrcAsc, TmpSrcAsc2, Range As Integer
Dim i As Integer
KeyLen = Len(Key)
If KeyLen = 0 Then
Key = "Think Space"
End If
KeyPos = 0
SrcPos = 0
SrcAsc = 0
Range = 256
offset = CInt("&H" + Mid(Src, 1, 2))
SrcPos = 3
Do While SrcPos < Len(Src)
SrcAsc = CInt("&H" + Mid(Src, SrcPos, 2))
If KeyPos < KeyLen Then
KeyPos = KeyPos + 1
Else
KeyPos = 1
End If
TmpSrcAsc = SrcAsc Xor Asc(keyk(KeyPos))
If TmpSrcAsc <= offset Then
TmpSrcAsc = 255 + TmpSrcAsc - offset
Else
TmpSrcAsc = TmpSrcAsc - offset
End If
If TmpSrcAsc > 127 Then
''''''''''''''''中文处理
Else
dest = dest + Chr(TmpSrcAsc)
offset = SrcAsc
SrcPos = SrcPos + 2
End If
Loop
UncrypKey = dest
End Function
/
DELPHI的一个加解密的函数,最近因为.NET中也需要使用.所以改写了一下,备忘.
其中有几个注意的地方:
1.DELPHI是从1开始的,NET是从0开始的.
2.MOD,xor等几个运算符的不同表示方法.
3.DELPHI中需要使用ORD,CHR,NET中可不用了.
4.十六进制保存时记着保留二位.
5.VB的中文处理方式不同,用chr(A&*256+B),具体代码因为一些其它原因不贴了.