2013-09-01 46 views
1

這個問題比編程問題更具數學意義。 我有解碼許可證密鑰並檢查其正確性的功能。反向多個異或,增加功能

見代碼:

ushort local6 = rand1; // generated random = 0x2ff2 
ushort local1 = rand2; // = 0x780e 
ushort local8 = rand3; // = 0x1e3c 
ushort local4 = rand4; // = 0xf521 
ushort temp1 = 0; // always zero 
ushort temp2 = 0; // always zero 

// THIS loop 
for (int i = 0; i < 8; i++) 
{ 
    local6 += stack2[0 + 6 * i]; 
    local1 += stack2[1 + 6 * i]; 
    local8 += stack2[2 + 6 * i]; 
    local4 += stack2[3 + 6 * i]; 
    temp1 = (ushort)(local6^local8); 
    temp1 += stack2[4 + 6 * i]; 
    temp2 = (ushort)((local1^local4) + temp1); 
    temp2 += stack2[5 + 6 * i]; 
    temp1 += temp2; 
    local6 = (ushort)(local6^temp2); 
    local4 ^= temp1; 
    temp1 ^= local1; 
    local1 = (ushort)(local8^temp2); 
    local8 = temp1; 
} 

// Results after loop: 
// local6 = 0x518a 
// local1 = 0x33e5 
// local8 = 0x8bca 
// local4 = 0x57de 

// validate date, checksums etc. 
if (_validate(local6, local8, local1, local4)) 
    return "Key " + rand1 + "-" + "rand2" + "-" + "rand3" + "-" + "rand4" + " is valid!"; 
else 
    return "Key invalid!"; 

爲了simplier讓它假設:

ushort[] stack2 = new ushort[52]; 

for (int i = 0; i < stack2.Length; i++) 
{ 
    stack2[i] = (ushort)i; 
} 

問題;這個循環是否可逆? 我的意思是它可以從循環後進行檢索值值

rand1, rand2, rand3, rand4 

local6, local1, local8, local4 

與循環功能的代碼的知識呢?我幾乎肯定這是不可能的,但想知道你在想什麼。

我分享的代碼是我的發明,我真的相信這種循環可以很好地保護反向工程師(串行破解器),除非他們暴力破解。

+0

抱歉堵塞您的意見。但是,這立即提醒我關於這個問題的「混淆命令ID」的答案:http://stackoverflow.com/a/18473308/2573395。我會說(沒有考慮到這一點),除非你反編譯代碼,否則即使你可以訪問大量生成的密鑰,也很難破解。除非對於大量的密鑰,您知道它們的順序,並且您嘗試使用所選可能適用的比特/混合操作的多重排列來關聯字節。 – Alex

+0

我認爲這屬於加密SE。 – usr

+0

爲什麼你認爲這是不可能的?從我所看到的,雖然有點乏味,但它是微不足道的。但是,驗證功能並不重要,您已經省略。要生成一個序列,你首先需要編譯通過驗證的'local6'等值,然後反向循環。反轉自己的循環似乎不夠。 – phant0m

回答

1

我試着把它放到像Z3這樣的SMT解算器中。堆棧可以用常量替換。 temp2也是每個點都不變。唯一可以逆轉的是temp2。希望SMT解決者能夠解決這個問題。

我懷疑這裏的擴散非常低,因爲我沒有看到任何旋轉。

什麼也使得它更容易反轉temp1temp2在每次迭代循環內重新初始化。如果它們在整個計算過程中進行將會更困難。

爲什麼你不使用像SHA256這樣的加密散列?

1

這可能很難,但我沒有看到任何理論上的單向計算。一切似乎都是可逆的。

+0

「硬」意味着「手工操作繁瑣」。正如你所指出的,每一步都是可逆的。 –