2014-02-25 64 views
-1

这是一个解码函数的十六进制值, 我试图找出它的编码功能,但没有运气。德尔福:恩/解码一些功能

function dtwin(flg: Integer): Integer; 
var i:integer; 
ner,yrd, yrv :Cardinal; 
unr :Int64; 
begin 
    ner := 1; 
    unr := flg; 
    yrd := $2E8CFFB0; 
    yrv := $0C8CFFF0; 
    for i := 1 to 32 do 
    begin 
    if (yrv and 1) <> 0 then 
     begin 
     ner := ((ner * unr) mod (yrd)); 
     end; 
    unr := ((unr * unr) mod (yrd)); 
    yrv := (yrv shr 1) and $7FFFFFFF; 
    end; 
    Result := ner; 
end; 
+0

也许解码被认为是困难的。 –

+0

至少你可以格式化你要求我们检查的代码。 –

回答

4

简短的回答是:这是不能做到的。

请阅读:

http://en.wikipedia.org/wiki/Modular_exponentiation

令B = FLG

令E = $ 0C8CFFF0 = 210567152

设M = $ 2E8CFFB0 = 780992432

,则此函数计算(b^e)mod m

为了反转它,我们需要找到e mod m的乘法逆。

我试过使用WolframAlpha。

http://www.wolframalpha.com/input/?i=multiplicative+inverse+of+210567152+mod+780992432

它给出的结果是:

(210567152不可逆模780992432)

其原因是,e和m不互质。他们都可以被两个整除。

由此我们可以得出结论:由于存在切割,因此无法扭转此功能。 作为一个例子:

dtwin(60)= dtwin(2326)= 62188800

什么应当与参数62188800称为反向函数返回? 它应该返回60还是2326?

这里有冲突的一些例子:

dtwin(658) = dtwin(1300) = 682595280 
dtwin(60) = dtwin(2326) = 62188800 
dtwin(1316) = dtwin(2600) = 76519712 
dtwin(2312) = dtwin(3522) = 317601904 
dtwin(1974) = dtwin(3900) = 52357088 
dtwin(120) = dtwin(4652) = 144155936 
dtwin(2632) = dtwin(5200) = 679101872 
dtwin(3290) = dtwin(6500) = 322955216 
dtwin(3989) = dtwin(6725) = 301338273 
dtwin(180) = dtwin(6978) = 628048624 
dtwin(4624) = dtwin(7044) = 435300992 
dtwin(5080) = dtwin(7658) = 2152880 
dtwin(3948) = dtwin(7800) = 682904608 
dtwin(2685) = dtwin(8183) = 461799889 
dtwin(2461) = dtwin(8951) = 170465 
dtwin(4606) = dtwin(9100) = 138445536 
dtwin(240) = dtwin(9304) = 231258592 
dtwin(4741) = dtwin(9603) = 586985553 
dtwin(6117) = dtwin(9923) = 277591073 

要产生结果,可能为加密是有用的,可以生成号码如下。 我不会在这里详细介绍它是如何工作的。如果您需要了解更多信息,可以使用Google公钥密码术。

Select P and Q that are prime. 
Compute N = P * Q 
Compute T = (P-1) * (Q-1) This is called the totient. 
Select E that is coprime to N and T. 
Select D that is the multiplicative inverse of E mod T. 

你的模N.这两个指数是E和D.

To encrypt A, calculate B = (A^E) mod N 
To decrypt B, calculate A = (B^D) mod N 

注意,在现实世界中的加密,这些值通常具有数字数百或数千。

这里有一些结果是在你的例子量级:

N = 590108483 =$232C5743 
E = 547145911 =$209CC8B7 
D = 507147559 =$1E3A7527 

N = 763464677 =$2D818BE5 
E = 545809367 =$208863D7 
D = 622691303 =$251D83E7 

N = 948703211 =$388C0FEB 
E = 885205759 =$34C32AFF 
D = 893844127 =$3546FA9F 

N = 897918037 =$35852455 
E = 894567871 =$355205BF 
D = 539129719 =$20227777 

N = 754905647 =$2CFEF22F 
E = 540902531 =$203D8483 
D = 534729131 =$1FDF51AB 
+0

非常感谢你,我会看到... – user3346964

+0

对不起,我想我得到了yrd和yrv混合在我的指示给你。 yrd是两个例程中的模数并且必须相同。 yrv必须是乘法逆。请问,yrd和yrv代表什么? –

+0

我必须道歉。我给出的生成有效模数和指数的方法是错误的。我修改了答案以提供正确的方法,并提供了一些工作示例。 –