首页
社区
课程
招聘
这个算法如何求逆?
2004-5-9 18:44 7146

这个算法如何求逆?

2004-5-9 18:44
7146
14 43 A5 C0(假如这是输入的注册码,中间无空格)

1、14 and c0=0
   43 and c0=40 shr 2=10
   A5 and c0=80 shr 4=8
   c0 adn c0=c0 shr 6=3

   0+10+8+3=1B

2、14 and 30=10 shl 2=40
   43 and 30=0
   A5 and 30=20 shr 2=8
   c0 adn 30=0 shr 4=0
   
   40+0+8+0=48

3、14 and 0c=4 shl 4=40
   43 and 0c=0 shl 2=0
   A5 and 0c=4
   c0 adn 0c=0 shr 2=0
   
   40+0+4+0=44

4、14 and 03=0 shl 6=0
   43 and 03=3 shl 4=30
   A5 and 03=1 shl 2=4
   c0 adn 03=0
   
   0+30+4+0=34

1B 48 44 34

经过1、2、3、4步运算后得出的值“1B 48 44 34”连起来“1B484434”在程序中等于机器码。

我的问题是:现在已知“1B 48 44 34”(中间无空格)值,如何反推出应该输入的注册码“14 43 A5 C0”(中间无空格)。
先谢了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞10
打赏
分享
最新回复 (8)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
n0n1inear 2004-5-10 00:29
2
0
逆向方法暂且不知,不过因为计算量小,用穷举的方法即可,以你的例子为例,只要几秒就可求得。代码如下,希望对你有帮助(此代码还可优化,毕竟tmp变量不必同时求出):
 
keygen
input  1b 48 44 34
output 14 43 a5 c0

//keygen.c
/******************************************/
#include <stdio.h>

main()
{
  unsigned int sn1,sn2,sn3,sn4,m1,m2,m3,m4,tmp1,tmp2,tmp3,tmp4;
  
  scanf("%x %x %x %x",&m1,&m2,&m3,&m4);
  for(sn1=0x0;sn1<=0xff;sn1++){
    for(sn2=0x0;sn2<=0xff;sn2++){
      for(sn3=0x0;sn3<=0xff;sn3++){
        for(sn4=0x0;sn4<=0xff;sn4++){
          tmp1=(sn1&0xc0)+((sn2&0xc0)>>2)+((sn3&0xc0)>>4)+((sn4&0xc0)>>6);
          tmp2=((sn1&0x30)<<2)+(sn2&0x30)+((sn3&0x30)>>2)+((sn4&0x30)>>4);
          tmp3=((sn1&0x0c)<<4)+((sn2&0x0c)<<2)+(sn3&0x0c)+((sn4&0x0c)>>2);
          tmp4=((sn1&0x03)<<6)+((sn2&0x03)<<4)+((sn3&0x03)<<2)+(sn4&0x03);
          if((tmp1==m1)&&(tmp2==m2)&&(tmp3==m3)&&(tmp4==m4)){
            printf("%02x %02x %02x %02x",sn1,sn2,sn3,sn4);
            return 0;
          }
        }
      }
    }
  }   
    
}
/******************************************/
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
n0n1inear 2004-5-10 00:30
3
0
格式都没了:(
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
n0n1inear 2004-5-10 00:42
4
0
for your convenience
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DamnYa 2004-5-10 01:12
5
0
考虑明白and得作用,还有0xc0 0x30 0x0c 0x03的二进制表示为
11000000 00110000 00001100 00000011就知道怎么逆向了
雪    币: 220
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ddzpro 2004-5-10 14:30
6
0
光顾着求逆,都忘了可以穷举了
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chaolumen86 2004-5-10 15:02
7
0
14 43 A5 C0  ==(4进制)=〉0110 1003 2211 3000

==(加密)=〉

0123 1020 1010 0310 ==(16进制)=〉1B 48 44 34

/////////////////////////////////////////
加密过程

0110   ----〉    0123
1003   ----〉    1020
2211   ----〉    1010
3000   ----〉    0310

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

解密算法和加密算法是同一个算法
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
n0n1inear 2004-5-10 17:26
8
0
:) RIGHT!

急着得到答案,方法一般不是太好:D
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
trw3000 2004-5-10 22:18
9
0
n0n1inear兄,你这段代码是C的,C我只懂一点,这段代码的计算过程是怎样的?第一次运算时sn1、sn2、sn3、sn4各是什么值?第二次运算又是什么值?第三次?请指点。
for(sn1=0x0;sn1<=0xff;sn1++){
for(sn2=0x0;sn2<=0xff;sn2++){
for(sn3=0x0;sn3<=0xff;sn3++){
for(sn4=0x0;sn4<=0xff;sn4++){
tmp1=(sn1&0xc0)+((sn2&0xc0)>>2)+((sn3&0xc0)>>4)+((sn4&0xc0)>>6);
tmp2=((sn1&0x30)<<2)+(sn2&0x30)+((sn3&0x30)>>2)+((sn4&0x30)>>4);
tmp3=((sn1&0x0c)<<4)+((sn2&0x0c)<<2)+(sn3&0x0c)+((sn4&0x0c)>>2);
tmp4=((sn1&0x03)<<6)+((sn2&0x03)<<4)+((sn3&0x03)<<2)+(sn4&0x03);
if((tmp1==m1)&&(tmp2==m2)&&(tmp3==m3)&&(tmp4==m4)){
printf("%02x %02x %02x %02x",sn1,sn2,sn3,sn4);

多谢各位帮忙, chaolumen86老兄我看懂如何求逆了。多谢了。
游客
登录 | 注册 方可回帖
返回