我从别处找来一段简单的异或加密函数,如下:
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数据库后出现问题了呢?