请教解密字符串 ( 积分: 50 )

  • 主题发起人 主题发起人 jieking
  • 开始时间 开始时间
J

jieking

Unregistered / Unconfirmed
GUEST, unregistred user!
密文:
"兄?巳衩补秃?尘谀牡____砸凹胗赖仿唤ㄍ罨?杏毓牡サ晃秃龈巳,级τ钡褡厥丁赖仿唤ㄍ舶?ǚ贰_____砸胗赖仿唤ㄍ罨??杏毓牡サ晃秃龈巳,级τ钡扒党赖仿唤ㄍ舶?ǚ海"这段代码原文是:
"中华人民共和国境内的____以及与道路交通活动有关的单位和个人,都应当遵守《道路交通安全法》_____以与道路交通活动动有关的单位和个人,都应当前车道路交通安全法:"
通过转换进16进制比较发现密码是转成16进制后位置有规律变换了一下位置再由十六进制转成字符的!
各位有什么好方法?
 
呵呵,既然已经发现规律了,把规律总结出来就是他加密的方法啊,、
 
我是菜鸟搞不定啊!所以才请教各路英雄!
 
楼主把两段字符串的16进制贴出来吧,大家帮你分析。
 
"兄?巳衩补秃?尘谀牡____砸凹胗赖仿唤ㄍ罨?杏毓牡サ晃秃龈巳,级τ钡褡厥丁赖仿唤ㄍ舶?ǚ贰_____砸胗赖仿唤ㄍ罨??杏毓牡サ晃秃龈巳,级τ钡扒党赖仿唤ㄍ舶?ǚ海"
密文十六进制:"D0D6AABBCBC8F1C3B2B9CDBAFAB9B3BEDAC4C4B55F5F5F5FD4D2B0BCEBD3C0B5B7C2BBBDA8CDEEBBAFB6D0D3D8B9C4B5A5B5BBCECDBAF6B8CBC82CBCB6A6D3B1B5F1D7D8CAB6A1C0B5B7C2BBBDA8CDB2B0ABC8A8B7B7A15F5F5F5F5FD4D2EBD3C0B5B7C2BBBDA8CDEEBBAFB6AFB6D0D3D8B9C4B5A5B5BBCECDBAF6B8CBC82CBCB6A6D3B1B5B0C7B5B3C0B5B7C2BBBDA8CDB2B0ABC8A8B7BAA3"
明文十六进制:D6D0BBAAC8CBC3F1B9B2BACDB9FABEB3C4DAB5C45F5F5F5FD2D4BCB0D3EBB5C0C2B7BDBBCDA8BBEEB6AFD3D0B9D8B5C4B5A5CEBBBACDB8F6C8CB2CB6BCD3A6B5B1D7F1CAD8A1B6B5C0C2B7BDBBCDA8B0B2C8ABB7A8A1B75F5F5F5F5FD2D4D3EBB5C0C2B7BDBBCDA8BBEEB6AFB6AFD3D0B9D8B5C4B5A5CEBBBACDB8F6C8CB2CB6BCD3A6B5B1C7B0B3B5B5C0C2B7BDBBCDA8B0B2C8ABB7A83A
 
解密的 我好有兴趣 关注中!!!
 
转换成16进制后,前后对调
 
我通过把汉字转换成十六进制得到 :D6D0BBAA="中华",上面密文的前面部分是D0D6AABB刚好把位置两位互换了一下,我编制了一下程序对十六进制进行位置互换,可是遇到单字节的字符如逗号,句号等...的时候就会错位,各位有没什么好方法,把中间的单字节的挑出来处理!
 
再转换成16进制时,都用4位数,单字节换成4位数,不够的话前导加0,这个问题简单
 
to wzquan
怎么找出所有的单字节的字符呢?
 
把所有的都按双字节处理,只是在转换成16进制时,要采用4位编码
 
TO wzquan
能否给一个例子,怎么样是采用4位编码?
 
具体的函数我也忘了,你看看delphi的16进制转换函数,我记得有转换成16进制后采用4位还是2位的一个参数
 
这样下来,保证转换后的16进制代码都是4位
var
mystr:string;
mystr1,my1,my2:string;
I:integer;
begin
mystr:=edit1.Text;
for i:=1 to length(myStr) do
begin
//my1:=copy(myStr,I,1);
memo1.Lines.Add(midstr(myStr,I,1));
myStr1:=mystr1+copy(myStr,I,1);
my1:=my1+Inttohex(ord(mystr),4);
end;
edit2.Text:=my1;
end;
 
这样转了是变成4位了,可是再转换回去变成汉字就转不了,:
比如说:D6D0BBAA2C="中华,"变成D6D0BBAA2C00,其它的就不用在前面加00了吧!
 
似乎可以直接对String数据操作:

procedure DecStr(var Str:String);
var
mc:Char;
i:Integer;
begin
i:=1;
while i<=Length(Str) do
begin
if Str>=#128 then //遇到双字节字符,进行前后对调
begin
mc:=Str;
Str:=Str[i+1];
Str[i+1]:=mc;
Inc(i,2);
end
else //单字节字符,略过
Inc(i);
end;
end;
 
因为你要求的是转换成16进制后,前后两位颠倒的,比如本来是0032,你要变成密文3200!还原时,你可以这样:
先每次读取4个字节,然后把读取的4个字节前后2个颠倒
aa:=copy(str,1,4)
aa1:=copy(aa,1,2)
aa2:=copy(aa,3,4)
aa3:=aa2+aa1;
再用strtoint('$'+aa3))); 变成汉字就可以了
 
strtoint('$'+aa3))); 不对吧!字符变成INT形怎么能变成汉字啊?
 
汉字内码对换一下,符号和其他不换。
可以对单个汉字进行操作。
 
to nicai_wgl
你是说:strtoint('$'+aa3))); 可以转?我编译不过去!
 
后退
顶部