我写了一个简单的加密程序当初是这样考虑的,为了使加密算法不可逆,我添加了一些中文。DLL中一部分代码是这样的: 
void Encipher(char a[16]) 

int i,len; 
int s=1; 
len=strlen(a); 
for(i=0;i <len;i++)     //部分代码

if(a[i]=='N') a[i]='你'; 
else 
if(a[i]=='H') a[i]='好'; 
else 
a[i]=a[i]+s; 
s=s+2; 

}
......
思路是这样的,用户注册时输入密码1,程序加密后得到密文2;用户登录时,输入密码3,程序同样加密,得到密文4。然后从数据库中提取账号对应的密文2,与密文4比较,相同则通过,不同则报错。在Delphi中写代码:
type 
  TArrChar = array[0..15] of char; 
procedure Encipher(a:TArrChar); stdcall;external 'Encph.dll' name 'Encipher'; 用户加密后可以存进数据库: 
    CopyMemory(@a,@Edit2.text[1],16); 
    Encipher(a); 
    Adotable1.Insert; 
    Adotable1.FieldByName('username').AsString:=trim(edit1.Text); 
    Adotable1.FieldByName('password').AsString:=a; 
    Adotable1.Post; 但是,用户登录时在Edit2中输入密码,后 
    CopyMemory(@a,@Edit2.text[1],16); 
    Encipher(a); 
    if Adotable1.FieldByName('password').AsString=a then 
    begin 
          //进入子系统 
    end 
  else messagedlg('密码错误!',mterror,[mbok],0); 可以运行,但是为什么提示密码错误呢? 
如果我添加一个无用的edit3,登录时的代码换成
CopyMemory(@a,@Edit2.text[1],16); 
Encipher(a); 
edit3.text:=a;
if Adotable1.FieldByName('password').AsString=edit3.text then
却又可以了。头疼的是,Edit3的Visiable属性必须为true才可以。
能不能有好办法不要添加无用的“edit3.text:=a”。我个人感觉是加密算法中中文的问题

解决方案 »

  1.   

    procedure Encipher(var a:TArrChar); stdcall;external 'Encph.dll' name 'Encipher'; 
      

  2.   

    Delphi中就有现成的函数可实现MD5加密,加密数据不可逆,不用这么费神吧?需要引用的单元:IdHashMessageDigest 和 IdHash
    代码简例:
    var
      md5 : TIdHashMessageDigest5;
      longWordRec : T4x4LongWordRecord;
    begin
      md5 := TIdHashMessageDigest5.Create;
      longWordRec:=md5.HashValue('string');
      ShowMessage(md5 .AsHex(longWordRec));
    end;简单说明:
    TIdHashMessageDigest5 类是在 IdHashMessageDigest 中声明的
    T4x4LongWordRecord 类是在 IdHash 中声明的
    md5.HashValue('string') 这个方法返回一个 T4x4LongWordRecord 类型的MD5签名后结果,参数可以是字符串或者流对象
    md5.AsHex(longWordRec) 这个方法返回的是 T4x4LongWordRecord 类型参数转换成字符串形式
      

  3.   

    不可逆么就可以直接使用md5,没这么麻烦。自己的写不可逆密码,可以这样,每个字符的ascii码平方根、开立方、取正弦等等,每次计算比如取中间的6位再进行下次的计算。最后把结果组合。