能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不能反推,穷举吧
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
多谢二楼的兄弟。
穷举未免太多了吧?假设 ch_tab_unknown 是 30 位char长度,效率不是一般化的低。
并且应该会有多个组合才对。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
是啊,很多加密是不能逆向的,这个是否能简化穷举到是可以考虑一下。不知有牛人来算一下吗。
|
能力值:
(RANK: )
|
-
-
5 楼
if ch_tab2[0] = 0
tmp1 = 0
tmp2 = 1
tmp3 = 0
ch1 = ch_tab_unknown[0]
tmp2 & ch1 = ch1 & 1 <= ch_tab_unknown[0] bit 0
i_out |= bit 0 << 0;
if ch_tab2[1] = 1
tmp1 = 1
tmp2 = 2
tmp3 = 0
ch1 = ch_tab_unknown[0]
tmp2 & ch1 = ch1 & 2 <= ch_tab_unknown[0] bit 1
i_out |= bit 1 << 1;
....
if ch_tab2[9] = 9
tmp1 = 0
tmp2 = 1
tmp3 = 1
ch1 = ch_tab_unknown[1]
tmp2 & ch1 = ch1 & 1 <= ch_tab_unknown[1] bit 0
i_out |= bit 0 << 9;
....
so, if ch_tab2[i] = 9 * x + y (0 <= y < 9)
tmp1 = y
tmp2 = 1^y
tmp3 = x
ch1 = ch_tab_unknown[x]
tmp2 & ch1 = ch1 & 1^y <= ch_tab_unknown[x] bit y
i_out |= bit y << i;
结论是可以根据ch_tab2和result确定ch_tab_unknown的大小以及其内容的各个值的某些特定Bit的值. 其他的Bit如果没有其他地方使用的话, 应该可以随意设成0或1.
反推算法:
for each bit i of result
let ch_tab2[i] = 9 * x + y
so, ch_tab_unknown[x] |= (bit i) << y
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
多谢arab的回复,经过你的提醒,我发现其实关键在于ch_tab2这个表的设置。
通过不同的内容,可取得unknown_tab中不同位并且排列的效果。
反推算式大概为:
if (((1 << i) & result) >> i) ch_tab_unknown[tmp3] | tmp2;
即判断result的每一位,并且通过ch_tab2来计算设置ch_tab_unknown中的对应bit.
呵呵。果然是可以逆推的。
|
|
|