unit password;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TFrmpwd = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  function encrypt_jia(s:string):String;
  function encrypt_free(s:string):string;
    { Private declarations }
  public
    { Public declarations }
  end;var
  Frmpwd: TFrmpwd;implementation{$R *.dfm}//加密函数
function TFrmpwd.encrypt_jia(s:string):String;
var
  i,j,k: Integer;
  s1: string;
begin
  s1 := '';
  j := Length(s);
  for i := 1 to j do
  begin
    k := j * j - i * i + 3;
    s1 := s1 + Chr(ord(s) + k);
  end;
  result := s1;
end;
//解密函数
function TFrmpwd.encrypt_free(s:string):String;
var
  i,j,k: Integer;
  s1: string;
begin
  s1 := '';
  j := Length(s);
  for i := 0 to j do
  begin
    k := j * j - i * i + 3;
    s1 := s1 + Chr(ord(s) - k);
  end;
  result := s1;
end;
//执行加密
procedure TFrmpwd.Button1Click(Sender: TObject);
var
  ss,st: string;
begin
  ss := Edit1.Text;
  Edit2.Text := UTF8Encode(encrypt_jia(ss));
end;
//执行解密
procedure TFrmpwd.Button2Click(Sender: TObject);
var
  ss:string;
begin
  ss := Edit3.Text;
  Edit4.Text := encrypt_free(ss);
end;end.测试的时候 显示的都是乱码,为什么? 
12345678 加密后  龞龛龖龏龆齻齮齟
龞龛龖龏龆齻齮齟  解密后  鼙鼚鼝鼢鼩鼲鼽齊齙
  求教大神

解决方案 »

  1.   

    function StrEnCrypt(Str: string): string; //加密字符串函数
    var
      i,Len: integer;
      C,H4,L4: Byte;
      s: string;
    begin
      Len:=Length(Str);
      s:='';
      for i:=1 to Len do
      begin
        C:=Ord(Str[i]);
        C:=C xor $A8;
        H4:=(C and $F0) shr 4;
        L4:=C and $0F;
        C:=(L4 shl 4) or H4;    s:=s+Chr(C);
      end;
      Result:=s;
    end;function StrDeCrypt(Str: string): string; //解密字符串函数
    var
      i,Len: integer;
      C,H4,L4: Byte;
      s: string;
    begin
      Len:=Length(Str);
      s:='';
      for i:=1 to Len do
      begin
        C:=Ord(Str[i]);
        H4:=(C and $F0) shr 4;
        L4:=C and $0F;
        C:=(L4 shl 4) or H4;
        C:=C xor $A8;    s:=s+Chr(C);
      end;
      Result:=s;
    end;
      

  2.   

    看下你用delphi 的版本,Delphi7 的ord()函数只能给字符,也就是char型,而在2010下ord()可以接受字符串了。
    如果是delphi7,在for循环里获取s[i]
      

  3.   

    自己对比看看就知道问题所在了:
    var
      Frmpwd: TFrmpwd;implementation{$R *.dfm}//加密函数
    function TFrmpwd.encrypt_jia(s:String):String;
    var
      i,j,k: Integer;
      s1: String;
    begin
      s1 := '';
      j := Length(s);
      for i := 1 to j do
      begin
        k := j * j - i * i + 3;
        s1 := s1 + Chr(ord(s[i]) + k);
      end;
      result := s1;
    end;//解密函数
    function TFrmpwd.encrypt_free(s:String):String;
    var
      i,j,k: Integer;
      s1: String;
    begin
      s1 := '';
      j := Length(s);
      for i := 1 to j do
      begin
        k := j * j - i * i + 3;
        s1 := s1 + Chr(ord(s[i]) - k);
      end;
      result := s1;
    end;//执行加密
    procedure TFrmpwd.Button1Click(Sender: TObject);
    var
      ss: String;
    begin
      ss := Edit1.Text;
      Edit2.Text :=string( UTF8Encode(encrypt_jia(ss)));
    end;//执行解密
    procedure TFrmpwd.Button2Click(Sender: TObject);
    var
      ss:String;
    begin
      ss := Edit2.Text;
      Edit4.Text :=encrypt_free(ss);
    end;end.
      

  4.   

    以上代码在delphi7、2010上编译运行通过