求一个算法,请高手帮忙! ( 积分: 100 )

  • 主题发起人 主题发起人 qylin1
  • 开始时间 开始时间
Q

qylin1

Unregistered / Unconfirmed
GUEST, unregistred user!
1、有一个[0..N]的字串(Str1)
2、输入一个数字串(Key)
3、根据输入的(Key)计算出另一个[0..N]的子串(Str2),但与(Str1)不同。
4、要求输入不同的(Key)计算出的结果也不同。
5、计算出的(Str2)可以根据(Key)计算出(Str1)
 
这是一个加密解密的问题阿.在网上搜一下就有的.
function Treg_Form.EncrypKey(Src: string; Key: string): string; //加密字符串
var
idx: integer;
KeyLen: Integer;
KeyPos: Integer;
offset: Integer;
dest: string;
SrcPos: Integer;
SrcAsc: Integer;
TmpSrcAsc: Integer;
Range: Integer;

begin
KeyLen := Length(Key);
if KeyLen = 0 then Key := 'Think Space';
KeyPos := 0;
SrcPos := 0;
SrcAsc := 0;
Range := 256;

Randomize;
offset := Random(Range);
dest := format('%1.2x', [offset]);
for SrcPos := 1 to Length(Src) do
begin
SrcAsc := (Ord(Src[SrcPos]) + offset) mod 255;
if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1;
SrcAsc := SrcAsc xor Ord(Key[KeyPos]);
dest := dest + format('%1.2x', [SrcAsc]);
offset := SrcAsc;
end;
Result := Dest;
end;

//解密函数

function Treg_Form.UncrypKey(Src: string; Key: string): string; //解密字符串
var
idx: integer;
KeyLen: Integer;
KeyPos: Integer;
offset: Integer;
dest: string;
SrcPos: Integer;
SrcAsc: Integer;
TmpSrcAsc: Integer;
Range: Integer;

begin
KeyLen := Length(Key);
if KeyLen = 0 then key := 'Think Space';
KeyPos := 0;
SrcPos := 0;
SrcAsc := 0;
Range := 256;
offset := StrToInt('$' + copy(src, 1, 2));
SrcPos := 3;
repeat
SrcAsc := StrToInt('$' + copy(src, SrcPos, 2));
if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest := dest + chr(TmpSrcAsc);
offset := srcAsc;
SrcPos := SrcPos + 2;
until SrcPos >= Length(Src);
Result := Dest;
end;
 
我不是要这样的加解密方法啊,是我说不清楚吗?
 
你在网上搜一下,
 
看来没人解决了
 
有點明白。。。。
 
多人接受答案了。
 

Similar threads

后退
顶部