哪位大侠看一下,为什么这个函数不能正确解密?(20分)

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

xhqing

Unregistered / Unconfirmed
GUEST, unregistred user!
我用这个函数给一字符串加密:
function fa(beforeStr:string):string;
var
key: string;
i, Len: integer;
begin
Len := Length(beforeStr);
key := 'password ASCII jm';
if Length(key) > Len then
key:=copy(key,1,Len)
else
if Length(key) < Len then
key := key + ' ';
SetLength(Result, Len);
for i:=1 to Len do
begin
result:=chr(swap(ord(beforeStr) xor ord(key)));
end;

而用下面这个函数解密,为什么得不到正确结果呢?经测试,解密得到的结果是
key := 'password ASCII jm'这个串的前几个字符:
function fb(beforeStr:string):string;
var key,rs:string;
i,Len:integer;
begin
Len:=length(beforeStr);
key:='password ASCII develop';
if Length(key) > Len
then key:=copy(key,1,Len)
else
if Length(key) < Len then begin key:= key + ' '; end;
result:='';
SetLength(Result,Len);
for i:=1 to Len do
begin
result:=chr(swap(ord(beforeStr)) xor ord(key));
end;

end;
原来设想是加密:先异或,再交换每个字节的高四位、低四位
解密:先交换每个字节的高四位、低四位,再异或(括号的位置看来没有错),
可是怎么得不到正确结果呢?我是通过写文件或是用Label.caption来显示的,希望得到高手的指点
 
以前用过的加密解密函数,楼主参考:
{ 加密 }
function EnCrypt(Str : string): string;
var
X: Integer;
A, Key: Byte;
TmpStr: string;
begin
TmpStr := '';
Randomize;
Key := RandomRange(1, $7F);
for X := 1 to length(Str) do
begin
A := (ord(Str[X]) and $0f) xor (Key and $0f);
TmpStr := TmpStr + char((ord(Str[X]) and $f0) + A);
end;
Result := char(Key) + TmpStr;
end;
{ 解密 }
function DeClassify(Str : string): string;
var
X: Integer;
A, Key: Byte;
TmpStr: string;
begin
if Str = '' then
Result := ''
else
begin
TmpStr := '';
Key := ord(Str[1]);
for X := 2 to length(Str) do
begin
A := (ord(Str[X]) and $0f) xor (Key and $0f);
TmpStr := TmpStr + char((ord(Str[X]) and $f0) + A);
end;
Result := TmpStr;
end;
end;
 
你不能 swap,因为你是char数组。
 
zywcd:
您好!
你说不能 swap,因为是char数组。
可我是按一个字符交换的啊,也就是说是对一个字符的ASCII码内部交换的,看起来好象对呀.哪你觉得该怎样修改呀?
 
但是实际情况不是这样的。你可以跟踪测试。我下午测试过你的程序,解密的时候就不对了。而且,加密的信息很有规律 。
 
zywcd:
您好!谢谢您的关心!我现在重新检验并测试了一下我的"读密码"函数,它没有错。再看解密算法,应该是正确的。我怀疑是不是“swap”函数有BUG,于是自己写了一个:
function defineSwap(n:integer):byte;
var lowBit,heightBit:byte;
begin
lowBit:=(n and $0f);
heightBit:=(n and $f0) shr 4;
result:=(lowBit shl 4 ) +heightBit;
end;
把此函数加入函数fb中,并把fb中调用的swap改为defineSwap,编绎、运行、检验,发现结果却是正确的。不知是不是我的安装盘(D7的)有问题,还是确实是Borland的疏忽。我上次也发现有本书介绍的、网上文章说的一个函数根本不能使用(好象不支持),现在我一时记不起是哪个函数了。请您再测试一下吧。
 
不要见笑,只有这一点分数了,我只剩下几十分了
 
请zywcd把您的相关研究情况发一份E-Mail给我:
xhwgq1001@yahoo.com.cn
 

Similar threads

后退
顶部