求字符串解秘方法(100分)

  • 主题发起人 主题发起人 tty0819
  • 开始时间 开始时间
T

tty0819

Unregistered / Unconfirmed
GUEST, unregistred user!
字符: 0 00 000 0000 ...
加密为:MA== MDA= MDAw MDAwMA== ...

A AA AB
QQ== QUE= QUI=

B BB BA
Qg== QkI= QkE=
算了半天,算不称头。那位高手帮帮忙。提供一个能把加密后的内容还原为未加密的字符的代码。
 
不就是Base64编码嘛,以前写着玩的,用的时候自己注意释放内存和出错处理

function GetBase64Char(const c: char): char;
begin
if ((c >= 'A') and (c <= 'Z')) then result := char(ord(c) - ord('A'))
else if ((c >= 'a') and (c <= 'z')) then result := char(ord(c) - ord('a') + 26)
else if ((c >= '0') and (c <= '9')) then result := char(ord(c) - ord('0') + 52)
else if (c = '+') then result := char(62)
else if (c = '/') then result := char(63)
else if (c = '=') then result := char(0)
else exit
//错误的字符
end;

function Base64Decode(source: string): pchar;
var psource, ptmp, pdest: pchar;
chunk: array[0..3] of char;
sourcelen, destlen, times, i: integer;
begin
psource := pchar(source);
sourcelen := Length(source);
if sourcelen mod 4 <> 0 then
begin
showmessage(inttostr(sourcelen mod 4));
exit
//错误的字符串长度
end;
times := sourcelen div 4;
destlen := 3 * times;
if (psource[sourcelen - 1] = '=') then dec(destlen);
if (psource[sourcelen - 2] = '=') then dec(destlen);

pdest := allocMem(destlen);
i:=0;
while (times>0) do
begin
chunk[0] := GetBase64Char(psource[0]);
chunk[1] := GetBase64Char(psource[1]);
chunk[2] := GetBase64Char(psource[2]);
chunk[3] := GetBase64Char(psource[3]);

pdest := char(ord(chunk[0]) shl 2 or ord(chunk[1]) shr 4);
if (psource[2] = '=') then break;
pdest[i+1] := char(ord(chunk[1]) shl 4 or ord(chunk[2]) shr 2);
if (psource[3] = '=') then break;
pdest[i+2] := char((ord(chunk[2]) shl 6) or ord(chunk[3]));
inc(psource, 4);
inc(i, 3);
dec(times);
end;
pdest := #0;
result := pdest;
end;
 
Base64Decode('MA==')得不到0
不过字符串加密方法应该是Base64编码了。我看看需要改什么地方才能用。
帮我看看怎么改呀,要做就做全套呀。:)
 
非常感谢了。结贴了。
 
后退
顶部