+ -
当前位置:首页 → 问答吧 → 字符加密解密函数,如果有中文就会解密不出来

字符加密解密函数,如果有中文就会解密不出来

时间:2011-08-16

来源:互联网

Delphi(Pascal) code

//对字符串加密(Source:源 Key:密匙)
function EncryptString(Source, Key: string):string;

var
  KeyLen: integer;
  KeyPos: integer;
  Offset: integer;
  Dest: UnicodeString;
  SrcPos: integer;
  SrcAsc: integer;
  Range: integer;
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;
//对字符串解密(Src:源 Key:密匙)
function UnEncryptString(Source, Key: string):string;

var
  KeyLen: integer;
  KeyPos: integer;
  Offset: integer;
  Dest:  UnicodeString;
  SrcPos: integer;
  SrcAsc: integer;
  TmpSrcAsc: integer;
begin
  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;


===========================================
加密字符中如果没有中文就能正常的加密解密,但是如果有中文,加密后就解密不出来,是什么原因呢?

作者: lshfong   发布时间: 2011-08-16

我用的是delphi2010

作者: lshfong   发布时间: 2011-08-16

我在delphi 7下测试能过!不过我把 UnicodeString 改成了 AnsiString。
你可以试下!

作者: jayqiang   发布时间: 2011-08-16

Dest := Dest + chr(TmpSrcAsc);
的问题,应该把TmpSrcAsc放到byte数组里,最后转成string

作者: liweixing   发布时间: 2011-08-16

热门下载

更多