-
-
[求助]请教高手一个算法的求逆,正算过程已知。
-
发表于:
2005-2-19 11:08
5231
-
有一软件,算法如下,我不知这是什么算法,以及如何求逆,请算法高手帮忙看看:
该算法是大整数运算,在这我用小整数代替。给定一个初始整数,如1211(十六进制,以下都是),找出比该数大的2的幂数的最小值,这儿是2000。先通过2000,1211计算一数,算法中要用,计算如下:
x0=0,x1=1 (初始值)
2000 mod 1211=def 商s1=1
x2=s1×x1+x0=1
1211 mod def=422 商s2=1
x3=s2×x2+x1=2
def mod 422=189 商s3=3
x4=s3×x3+x2=7
......
79 mod 1e=1 商s7=4
x8=s7×x7+x6=10f
1e mod 1=0 商s8=1e
x9=s8×x8+x7=2000
其中x8=10f在下面计算中要用到。
假设上列计算为函数F1(2000,1211)=10f。
以上我有一点不明白,怎么x9又等于2000(初值)?这段计算是求什么?
好,下面进入算法的关键:
2000-1211=def
2000×3412=6824000 (3412是注册文件中的数,要逆求的东西,我先随便给了个值)
6824000 mod 1211=c26
假设A1=c26,A2=def,再给定一个32位二进数常数,设为C=c[31]c[30]....c[0](c[i]为对应的0或1)
for(i=0;i<32;i++) (32为十进制)
{
if(c[i]!=0)
{
A2=F2(A1,A2)
}
A1=F2(A1,A1)
}
其中:
F2(A1,A2)
{
A1×A2=a9457a 以A1=c26,A2=def为例计算
a9457a×10f=b3308c26 ; 10f为上面计算出的x8,计算中10f不变
取b3308c26的低d位=c26 ; d是初始数1211的位数
c26×1211=db7a86 1211:初始数
a9457a+db7a86=184c000
184c000右移d位=c26 计算结果, 相当于取高d位?
ruturn 计算结果 A1=c26,A2=def时等于c26
}
得到循环计算结果A2后,再计算:
F1(1211,def)=99
D=A2×99 mod 1211
D要等于硬件序列号。
也许我描述的有些小错误,但大体是这样。大侠们看看,这是什么算法?该怎样求逆?谢谢。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!