已知一个字符解密函数如下,请写出相应的加密函数,高手请出招。function decrypt(key:word;str: string): string;
var
i: integer;
j, tt, tt2: word;
tmp: string;
tmpword: array of word;begin
tt2 := key;
setlength(tmpword, length(str) div 2);
for i := 0 to length(tmpword) - 1 do
begin
tmpword[i] := strtoint('$' + str[i * 2 + 1] + str[i * 2 + 2]);
end;
for i := 0 to length(tmpword) - 1 do
begin
tt := tt2;
tt := tt shr 8;
j := tmpword[i] xor tt;
if j > 0 then
begin
tmp := tmp + char(j);
tt := tt2 + tmpword[i];
j := tt * $0B;
j := j + $0C;
tt2 := j;
end
else
begin
j := tmpword[i];
tmp := tmp+char(j);
j := tt2 * $0B;
j := j + $0C;
tt2 := j;
end; end; result := tmp;
end;
var
i: integer;
j, tt, tt2: word;
tmp: string;
tmpword: array of word;begin
tt2 := key;
setlength(tmpword, length(str) div 2);
for i := 0 to length(tmpword) - 1 do
begin
tmpword[i] := strtoint('$' + str[i * 2 + 1] + str[i * 2 + 2]);
end;
for i := 0 to length(tmpword) - 1 do
begin
tt := tt2;
tt := tt shr 8;
j := tmpword[i] xor tt;
if j > 0 then
begin
tmp := tmp + char(j);
tt := tt2 + tmpword[i];
j := tt * $0B;
j := j + $0C;
tt2 := j;
end
else
begin
j := tmpword[i];
tmp := tmp+char(j);
j := tt2 * $0B;
j := j + $0C;
tt2 := j;
end; end; result := tmp;
end;
解决方案 »
- 元旦快乐,散分
- Indy 发送邮件
- 如何给一个控件添加双击事件?
- 关于服务
- 请教高手,ADOQuery中的参数值为什么不能为空!
- 已知一个点的坐标(x,y),然后用SetWorldTransform变换坐标系后,求屏幕上同一个点的位置的新坐标值。各为帮帮忙啊
- 寻使用ADO组件向SQL server数据库追加记录的最好方法,具体情况如下:
- 送分100分:如何调试DLL程序
- 一个用Show显示窗口只保持一个窗口(MAINFORM)的最上方,不能用简单用fsStayOnTop
- Js调用delphiOCX里的函数,报对象不支持"Test"属性或方法
- 运行Indy10提供的Demo Base例子,什么都没改动,为什么客户端一连接CPU就100%,Chat2.0也一样
- 刷新的问题???
其中,一些变量我是照你的题目复制而来,用得可能有些乱;再就是,还没有写“位移并异或”后<0的处理,所以,请仅测试4位十进数密码(加密后,即加密前2位)function Tform1.enCrypt(key:word; str: string): string;
var
i,LenStr: integer;
tt, tt2: word;
tmp: string;
tmpword: array of word;
begin
tt2 := key;
LenStr := length(str);
setlength(tmpword, LenStr);
for i := 0 to LenStr-1 do
begin
tt := tt2;
tt := tt shr 8;
tmpword[i] := ord(str[i+1]) xor tt;
tt := tt2 + tmpword[i];
tt := tt * $0B;
tt := tt + $0C;
tt2 := tt;
end;
tmp:='';
for i:=0 to LenStr-1 do
tmp:= tmp + inttohex(tmpword[i],2);
result := tmp;
end;
var
i: Integer;
j, tt: Word;
begin
for I := 1 to Length(str) do
begin
tt := key;
tt := tt shr 8;
j := Byte(str[I]) xor tt;
if j > 0 then
begin
Result := Result + Format('%.2x', [j]);
tt := key + j;
j := tt * $0B;
end
else
begin
j := Byte(str[I]);
Result := Result + Format('%.2x', [j]);
j := key * $0B;
end;
j := j + $0C;
key := j;
end;
end; for i := 0 to length(tmpword) - 1 do
begin
tmpword[i] := strtoint('$' + str[i * 2 + 1] + str[i * 2 + 2]);
end;
上面代码可以分析出加密后是十六进制字符串 tt := tt shr 8;
之后分析tt掩码的计算
var
i,LenStr: integer;
tt, tt2: word;
tmp: string;
tmpword: array of word;
begin
tt2 := key;
LenStr := length(str);
setlength(tmpword, LenStr);
for i := 0 to LenStr-1 do
begin
tt := tt2;
tt := tt shr 8;
tmpword[i] := ord(str[i+1]) xor tt;
if i<4 then
begin
tt := tt2 + tmpword[i];
tt := tt * $0B;
end
else
begin
tt := tt2 * $0B;
end;
tt := tt + $0C;
tt2 := tt;
end;
tmp:='';
for i:=0 to LenStr-1 do
tmp:= tmp + inttohex(tmpword[i],2);
result := tmp;
end;
强烈鄙视技术问题解决后把贴子转移到非技术区的人!
鄙视你们!http://community.csdn.net/Expert/topic/5216/5216675.xml?temp=.9262659