2013-01-17 47 views
0

我在寫一個桌面Java應用程序。該程序從客戶的服務器接收XML文件。幾個標籤中的數據是整數類型的,並用一些數學公式「加密」。 當我的程序解析XML文件時,我需要解密這些標籤。解密公式如下所示:
int decrypted = (int) Math.ceil(Math.pow ((idProduct + 1)/3, 1.5));
解密的數據然後保存到H2數據庫,該數據庫使用AES-128加密。

我需要的是以某種方式從反編譯中隱藏這樣的公式。
在Java中反編譯隱藏數學公式/算法

我的嘗試:
1.爲了隱藏公式,我嘗試使用混淆器,但是我沒有發現任何與公式無關的公式。這是一個被ProGuard的4.8混淆和反編譯的JAD一段代碼:

private String d(String paramString) { 
    long l = Long.valueOf(paramString).longValue(); 
    int i = (int)Math.ceil(Math.pow((l + 1L)/3L, 1.5D)); 
    String str = String.valueOf(i); 

    return str; 
} 

正如你所看到的ProGuard什麼也沒做用公式。我們不能使用像Zelix KlassMaster這樣的商業混淆器。
2.我正在考慮嘗試JET Excelsior(但看起來java 7 apps're還不支持)。另外,我不認爲我的老闆會讚賞。
3.我也想過使用launch4j這樣的包裝器,但我不知道是否很難從中提取.jar。
4.然後我想到在C中編寫一個外部庫並使用JNI。但似乎競爭對手只能使用該庫。
5.良好的解決方案IMO是在ASM中編寫解密函數並將其直接粘貼到java代碼中,就像我們可以做到的那樣是C.不幸的是,這是不可能的。
6.類的加密是pointless to use
我知道所有的東西都可以反編譯/反彙編,我只是想讓它比運行JAD更容易一點。

請告訴我

+4

如何把它放在服務器上並進行web服務調用? –

+0

他們不是很難的功能,爲什麼不重新實現它們然後混淆? –

+3

通過默默無聞的安全是一個非常糟糕的想法。如果您正在嘗試加密數據,則應該強烈考慮使用衆所周知的開放式加密算法,以便即使人們對程序進行反編譯也不會破壞安全性。 – templatetypedef

回答

0

您不能從確定找到它的人隱藏公式。

混淆Java代碼不會執行任何操作,因爲.class文件可以反編譯,並且算法可以相對容易地提取。

你可以做的最好的是在C/C++中實現公式,並通過JNI鏈接它。但即使採用這種方法,也有人可以反編譯C++,只需稍加努力就可以逆向工程。

你可能通過散佈出來幾個不相關的方法必須都得到處理過程中調用中,如果您的應用程序,它提供了機會,這樣做的結構隱藏它。

+0

如果競爭對手不得不反編譯C/C++代碼,我會感到滿意,但是他們是不是隻能將該庫鏈接到自己的代碼並將所有數據傳遞給它? –

+1

那麼你想要什麼:隱藏算法,或阻止用戶使用它? –

+0

@AlexeiKaigorodov我想讓它更難解密這些XML。要隱藏該算法,以便在查看反編譯器輸出的10分鐘內無法寫入解密腳本。另一方面,我想使解密代碼(例如本地庫)的使用複雜化。 –

2

當你想在ASM寫式/ C/C++,然後通過JNI訪問它的,這意味着以表示在一個不同的指令集的公式。不用硬件指令集,你可以創建你自己的,並在代碼中嵌入一個解釋器。這樣做的缺點是執行效率較低,但具有使用不常見指令集的優勢,因此競爭對手應首先從解釋器的字節碼中重新構建您的自制指令集。你可以設計你的指令集比x86更容易理解。

然後,您可以遞歸應用此想法:寫解釋在另一個解釋指令集等。

+1

有趣的想法,但實施不值得。 –

+1

+1,「比x86更容易理解」。 –