改写了一个常用的DELPHI的加解密函数

改写了一个常用的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),具体代码因为一些其它原因不贴了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值