请教高手:关于加密数据存入MDB数据库问题---急!急!急! ( 积分: 30 )

  • 主题发起人 主题发起人 muree
  • 开始时间 开始时间
M

muree

Unregistered / Unconfirmed
GUEST, unregistred user!
我从别处找来一段简单的异或加密函数,如下:
function DenCrypt(sString: string): string;
const
sPwd: string = 'ABCDE'; //随意密钥
var
iLen, iPwdLen: Integer;
bTemp : Byte;
begin
iPwdLen := 1;
for iLen := 1 to Length(sString) do
begin
bTemp := (Ord(sString[iLen]) and $0F) xor (Ord(sPwd[iPwdLen]) and $0F);
sString[iLen] := Char((Ord(sString[iLen]) and $F0) + bTemp);
Inc(iPwdLen);
if iPwdLen > Length(sPwd) then iPwdLen := 1;
end;
Result := sString;
end;
然后正常在程序中调用该函数,举个例子,如果 Edit1.Text := '圣诞节五条禁令:禁止假装工作忙不理我。禁止发财忘了我。禁止有难不帮我。禁止吃巧克力不叫我。禁止闲时不想我。望认真贯彻!',那么执行 Edit1.Text := DenCrypt(Edit1.text),返回的值是:Edit1.Text = '帅丢杠射析哈情;盔壹恨植籂荫魔案蔫日牎?涌埃芭声翘闲ⅶ庚迅延涝醇表椭ぅ胡院费廖旧垄方貉萄ウ稽谆淘戏岛丸首Г贴怂朽距焙%',再执行一次,Edit1.Text 会返回原来的值(程序异或的结果),即 Edit1.Text := '圣诞节五条禁令:禁止假装工作忙不理我。禁止发财忘了我。禁止有难不帮我。禁止吃巧克力不叫我。禁止闲时不想我。望认真贯彻!'。再反复执行,Edit1.Text 以上面的两个值反复变换。
如果只执行 DenCrypt(Edit1.text) 一次后存入MDB数据库,如 Query1.FieldByName('信息').AsString := DenCrypt(Edit1.text),即数据库中信息字段赋值为:'帅丢杠射析哈情;盔壹恨植籂荫魔案蔫日牎?涌埃芭声翘闲ⅶ庚迅延涝醇表椭ぅ胡院费廖旧垄方貉萄ウ稽谆淘戏岛丸首Г贴怂朽距焙%'(不包换单引号,与上一段落第一次异或后的值完全一致)后,再执行 Edit1.Text := DenCrypt(Query1.FieldByNam('信息').AsString),得到的值有一大部分是乱码,经多次试验发现,具体是 '?' 以后的字符是乱码。
据此,我觉得是 '?' 这个字符在存入MDB数据库后出现变异,致使第二次异或后在其之后的字符得不到原来的值!
小弟在此请教各位高手,是这段异或加密程序有问题,还是真的是 '?' 这个字符在存入MDB数据库后出现问题了呢?
 
存入数据后,可能是sString的长度变了,测试一下sString的长度
 
我试过多次,和长度没有关系,因为我每次存取很多数据,但存取后,其中一部分既有长也有短的数据会出现乱码,而其他的有长或短的数据不会出现乱码。
还有其他高手吗?请帮忙解决,谢谢!
 
[:D]假如乱码的话,可以改加密算法
而且位数固定就可以了!
 
有些时侯加密的密文含有特殊字符文本框不能显示、数据库文本字段也不能存储。建议加密成十六进制形式表示,就不会出现该种情况。
 

Similar threads

后退
顶部