首页
社区
课程
招聘
[求助]可逆算法否?
发表于: 2012-4-19 17:37 11554

[求助]可逆算法否?

2012-4-19 17:37
11554
已知 a,b,c 三个常量
有如下 等式

[(Y xor a) +a+b+Y] xor Y=c

Y是否可逆?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (22)
雪    币: 2993
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
看起来式子挺简单的,但是说实话盯了好久没明白式子在干吗。。。不如LZ弄个Multisim去跑一下?
2012-4-19 18:04
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
这是一个算法的其中一部分,我简化了,穷举太麻烦了。
2012-4-19 19:07
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LZ的说法有点不确切,应该说:
已知a,b,c三个值,能否由方程 [(Y xor a) +a+b+Y] xor Y=c 快速求取未知量Y。
采用分治法,给出一个思路如下,应该可行吧:
假设a,b,c,Y都是32比特非负整数吧,Y=y[31...0] (比特下标)。
1、利用[(Y xor a) +a+b+Y] xor Y=c先求取Y的最低比特位y0,这是很容易求的,实际上y0 = b0 ^ c0;
2、再用[(Y xor a) +a+b+Y] xor Y=c的最低2比特求取Y的次低比特位y1,同样是线性方程,故y1立得;
3、依此类推,直到最后求取Y的最高比特位y31。
整个过程不需要穷举。
2012-4-20 09:06
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=jeffcjh;1065510]LZ的说法有点不确切,应该说:
已知a,b,c三个值,能否由方程 [(Y xor a) +a+b+Y] xor Y=c 快速求取未知量Y。
采用分治法,给出一个思路如下,应该可行吧:
假设a,b,c,Y都是32比特非负整数吧,Y=y[31...0] (比特下标)。
1、利用[(Y xor a...[/QUOTE]

先谢谢。上面的看到有点晕(的最低2比特求取Y的次低比特位y1,同样是线性方程,故y1立得),呵呵

a=$11F (16 进制)
b=$7181590E
c=$28836E00
怎么求Y?
2012-4-20 09:46
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
可逆,因为异或运算没有数位损失,如果有数位损失的话,就不一定可逆了(不一定可逆,是向逆向后空间很大,已失去意义 了),
如果位损失 的话,逆向过来,有可能Y是一个集合,空间未知,需要进一步考查

注意 :进位和借位不算数位损失

数位损失的算法有,除法(仅在计算机中有损失 ,理论是无损失),移位,与运算,或运算,反补运算
2012-4-20 09:52
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
  有点晕
2012-4-20 09:54
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主 运算符‘+’代表加法运算吗?
2012-4-20 10:38
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
是,
2012-4-20 10:40
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=jeffcjh;1065510]LZ的说法有点不确切,应该说:
已知a,b,c三个值,能否由方程 [(Y xor a) +a+b+Y] xor Y=c 快速求取未知量Y。
采用分治法,给出一个思路如下,应该可行吧:
假设a,b,c,Y都是32比特非负整数吧,Y=y[31...0] (比特下标)。
1、利用[(Y xor a...[/QUOTE]

这位的方法好像可行

按位运算,求低1位时,加法可以按异或来运算,来求出Y0的值,并且记录下a0+b0+Y0是否进位
如果进位,代入下一次运算为(同样全为异或运算)
[(Y1 xor a1) +a1+b1+Y1+1] xor Y1=c1
如果不进位,则不代入运算

这样,运算32次,就完成了
2012-4-20 10:59
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
[(Y xor a) +a+b+Y] xor Y=c

按位分解为:
Y0 xor a0 xor a0 xor b0 xor Y0 xor Y0=c0
a0 xor a0=0
Y0 xor Y0 = 0;
故:Y0 xor 0 xor b xor 0 = c
==>> Y0 = b0 xor c0

if( (Y0 xor a0) +a0+b0+Y0 有进位 )
{
代入 [(Y1 xor a1) +a1+b1+Y1+1] xor Y1=c1(这里,有可能会进两位,分别代入y2,y3)
}else
{
Y1 = b1 xor c1
}
2012-4-20 11:11
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=choday;1065579][(Y xor a) +a+b+Y] xor Y=c

按位分解为:
Y0 xor a0 xor a0 xor b0 xor Y0 xor Y0=c0
a0 xor a0=0
Y0 xor Y0 = 0;
故:Y0 xor 0 xor b xor 0 = c
==>> Y0 = b0 xor c0...[/QUOTE]

非常感谢热心解答,但是我逆出来的结果MS不对。   进位进的我发晕。。。
2012-4-20 14:21
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=choday;1065576]这位的方法好像可行

按位运算,求低1位时,加法可以按异或来运算,来求出Y0的值,并且记录下a0+b0+Y0是否进位
如果进位,代入下一次运算为(同样全为异或运算)
[(Y1 xor a1) +a1+b1+Y1+1] xor Y1=c1
如果不进位,则不代入运算

这样,运算32次,就完成了[/QUOTE]

谢谢。我的思路具体化就是这个意思了。求取方法的关键就是利用在GF(2)上算术加等同于异或运算,故可以将原来的非线性方程通过进位信息依次转化成32个线性方程,故Y的每个比特分位立得。
2012-4-20 17:33
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
谢谢两位的精彩解答,搞定了,就是代码写的不是很理想,不知有什么办法来简化整个过程,关键在于进位的处理上
2012-4-20 17:52
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
犯二了,字数.exe
2012-4-25 21:05
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
代码就不贴了,自己看下面这个地址。
http://codepad.org/EfNXOqQQ

这是你要的结果:
[(28836E00 xor 11F)+11F+7181590E+28836E00] xor 28836E00 =28836E00

貌似有点问题,大家检查一下,应该是不行的,很久之前就讨论过这个问题。
2012-5-8 23:03
0
雪    币: 136
活跃值: (429)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
17
[QUOTE=没有姓名;1070816]代码就不贴了,自己看下面这个地址。
http://codepad.org/EfNXOqQQ

这是你要的结果:
[(28836E00 xor 11F)+11F+7181590E+28836E00] xor 28836E00 =28836E00

貌似有点问题,大家检查一下,应该是不行的,很久之前就讨...[/QUOTE]

谢谢您的代码,按前面讨论给出的方法是可行,我测试了,就是对进位的处理比较麻烦
2012-5-9 09:42
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
那如果这样的话,那是否已知a+b以及a xor b就可以把a,b计算出来?
2012-5-22 21:38
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
是的,如果已知 a+b=c 以及a xor b =d (c,d 为已知),则可以计算出a,b的值。但是这个方程组的解的个数是不确定的,有可能有很多,有可能无解。当 c=0xBF,d=0x13f 时候,至少有80个满足条件的解。
a xor b=bf
a+b=13f
a=40,  b=ff;    a=41,  b=fe;    a=42,  b=fd;    a=43,  b=fc;    a=44,  b=fb;
a=45,  b=fa;    a=46,  b=f9;    a=47,  b=f8;    a=48,  b=f7;    a=49,  b=f6;
a=4a,  b=f5;    a=4b,  b=f4;    a=4c,  b=f3;    a=4d,  b=f2;    a=4e,  b=f1;
a=4f,  b=f0;    a=50,  b=ef;    a=51,  b=ee;    a=52,  b=ed;    a=53,  b=ec;
a=54,  b=eb;    a=55,  b=ea;    a=56,  b=e9;    a=57,  b=e8;    a=58,  b=e7;
a=59,  b=e6;    a=5a,  b=e5;    a=5b,  b=e4;    a=5c,  b=e3;    a=5d,  b=e2;
a=5e,  b=e1;    a=5f,  b=e0;    a=60,  b=df;    a=61,  b=de;    a=62,  b=dd;
a=63,  b=dc;    a=64,  b=db;    a=65,  b=da;    a=66,  b=d9;    a=67,  b=d8;
a=68,  b=d7;    a=69,  b=d6;    a=6a,  b=d5;    a=6b,  b=d4;    a=6c,  b=d3;
a=6d,  b=d2;    a=6e,  b=d1;    a=6f,  b=d0;    a=70,  b=cf;    a=71,  b=ce;
a=72,  b=cd;    a=73,  b=cc;    a=74,  b=cb;    a=75,  b=ca;    a=76,  b=c9;
a=77,  b=c8;    a=78,  b=c7;    a=79,  b=c6;    a=7a,  b=c5;    a=7b,  b=c4;
a=7c,  b=c3;    a=7d,  b=c2;    a=7e,  b=c1;    a=7f,  b=c0;    a=c0,  b=7f;
a=c1,  b=7e;    a=c2,  b=7d;    a=c3,  b=7c;    a=c4,  b=7b;    a=c5,  b=7a;
a=c6,  b=79;    a=c7,  b=78;    a=c8,  b=77;    a=c9,  b=76;    a=ca,  b=75;
a=cb,  b=74;    a=cc,  b=73;    a=cd,  b=72;    a=ce,  b=71;    a=cf,  b=70;
a=d0,  b=6f;    a=d1,  b=6e;    a=d2,  b=6d;    a=d3,  b=6c;    a=d4,  b=6b;
a=d5,  b=6a;    a=d6,  b=69;    a=d7,  b=68;    a=d8,  b=67;    a=d9,  b=66;
a=da,  b=65;    a=db,  b=64;    a=dc,  b=63;    a=dd,  b=62;    a=de,  b=61;
a=df,  b=60;    a=e0,  b=5f;    a=e1,  b=5e;    a=e2,  b=5d;    a=e3,  b=5c;
a=e4,  b=5b;    a=e5,  b=5a;    a=e6,  b=59;    a=e7,  b=58;    a=e8,  b=57;
a=e9,  b=56;    a=ea,  b=55;    a=eb,  b=54;    a=ec,  b=53;    a=ed,  b=52;
a=ee,  b=51;    a=ef,  b=50;    a=f0,  b=4f;    a=f1,  b=4e;    a=f2,  b=4d;
a=f3,  b=4c;    a=f4,  b=4b;    a=f5,  b=4a;    a=f6,  b=49;    a=f7,  b=48;
a=f8,  b=47;    a=f9,  b=46;    a=fa,  b=45;    a=fb,  b=44;    a=fc,  b=43;
a=fd,  b=42;    a=fe,  b=41;    a=ff,  b=40;    count=80
2012-7-20 15:22
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=没有姓名;1070816]代码就不贴了,自己看下面这个地址。
http://codepad.org/EfNXOqQQ

这是你要的结果:
[(28836E00 xor 11F)+11F+7181590E+28836E00] xor 28836E00 =28836E00

貌似有点问题,大家检查一下,应该是不行的,很久之前就讨...[/QUOTE]

代码中 s = (((Y^a)+a+b+Y)^Y==c) ? 1 : 0;     少了一个括号,这句话相当于:
s = (((Y^a)+a+b+Y)^(Y==c)) ? 1 : 0;  异或运算的优先级 比 == 运算低

正确的语句应该是  s = ((((Y^a)+a+b+Y)^Y)==c) ? 1 : 0;
倒说求得的结果怎么正好就等于c了呢。
2012-7-20 16:41
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
计算结果:Y = 75FE06CC
[(75FE06CC xor 11F)+11F+7181590E+75FE06CC] xor 75FE06CC =28836E00
2012-7-20 18:36
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
解的数量情况如何确定?有相关的结论吗?
2012-7-20 22:18
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
没看到相关结论。不过知道这个方程组解的数量,有什么用吗?
2012-7-22 14:08
0
游客
登录 | 注册 方可回帖
返回
//