哪位高手碰过这样的问题,我把字符串加密后存到数据库,然后从数据库读出来,再解密就出现错误,这个是怎么回事???有什么特殊字符数据库不能保存吗?(30分)

  • 主题发起人 主题发起人 xiaoxiami1
  • 开始时间 开始时间
X

xiaoxiami1

Unregistered / Unconfirmed
GUEST, unregistred user!
这是两个函数,比如90#无铅汽油,在edit控件加密和解密都没事,只要存到数据库再取出来解密就不对了!!!!!!!!!!!!!
function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(Result) + StartKey) * MultKey + AddKey;
end;
end;


function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(InString) + StartKey) * MultKey + AddKey;
end;
end;
 
我觉得你在函数中改变StartKey的值会有问题
建议改为
function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
TempKey:Integer;
begin
Result := '';
TempKey:=StartKey;
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (TempKey shr 8));
TempKey:= (Byte(Result) + TempKey) * MultKey + AddKey;
end;
end;
 
你的数据库中的字段类型是什么? 最好设置为varbinary,因为你的加密后的字符不一定是可视字符了,若保存到char或varchar中就有可能丢失
 
最好用base64加一层编码.
 
加密,解密的两个函数,有问题
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
这里CHAR 后面的结果有可能是0,而CHAR(0)是一个字符串终止符号,
Result后面就没有了
建议改成var参数,类型是一个缓冲区
写到数据库里,也不要用字符类型
 
我也碰到这个问题过!用XOR进行加密,有的就不能还原,最后只好换了加密码!
另:这种加密方法很容易被破解吗?
 
谁有好的加密算法请给我发一份。谢谢!zhengganghua@163.com
 
我在写注册表时也遇到过同样的问题
 
将"for I := 1 to Length(InString) do"
改为:for I := 1 to Length(TrimRight(InString)) do 试试
我有DES加密算法,是C++版的,要不要?
ynzhangyao@sina.com
 
用什么加密方法都无所谓,那只是强度问题,跟你要保护的东西的价值
相比,合适就行,不一定非要DES,MD5,那要好几百行代码呢.

关键是,当加密/解密得到的不是字符串,就不要用字符串处理,而是用
字节的数组
 
多人接受答案了。
 
后退
顶部