我写了一个简单的加密程序当初是这样考虑的,为了使加密算法不可逆,我添加了一些中文。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”。我个人感觉是加密算法中中文的问题
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”。我个人感觉是加密算法中中文的问题
代码简例:
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 类型参数转换成字符串形式