2012-05-06 64 views
0

我正在開發一種加密遊戲數據文件的方法,該方法將用於我創建的遊戲引擎中。遊戲數據文件將使用私鑰加密,並在加載到遊戲引擎後解密。C++宏中的隨機數

私鑰將在發動機手動設置(作爲常數),使得其被編譯到發動機中。然而,這個技巧是在那裏混淆它,這樣你的普通Joe Bloggs就無法(簡單地)簡單地通過反彙編和反向工程代碼來找到密鑰。

struct Example { 
    u_int8_t random1; 
    u_int64_t segment31; 
    u_int8_t random2; 
    u_int8_t random3; 
    u_int64_t segment3; 
    u_int64_t segment14; 
    // Etc 
}; 

我的想法是將密鑰存儲在與隨機生成的字節混雜在一起的段中。我的問題是這樣的:

有什麼辦法可以在C++宏中隨機生成一個數字嗎?該編號必須在編譯時隨機生成(或隨機值設置爲隨機用戶選擇的值),因此任何運行時功能都不好。

我接受任何建議,如果有這樣做的更好的辦法,但我肯定要帶一個私人/公共密鑰對加密的遊戲數據文件,以及公開密鑰保持私人越好。

+0

你可以去看一下:使用C預處理程序生成一個隨機數] [1] [1]:http://stackoverflow.com/a/17420032/653372 – nergeia

+1

_ @ orangething_如果你問自己?那麼我在服務。 –

回答

1

既然你是產生在編譯時的常數的隨機數,這將成爲烘焙到你的程序,我沒有看到,只是硬編碼(你自己選擇的)的隨機數到它自己之間的差異。我想用一個宏,每個編譯都會得到一個不同的隨機數。這真的如此重要嗎?

我建議做一些簡單的:如果該鍵是簡單的ASCII文本(比特位,對吧?),你可以使用一個inocuous前瞻性診斷字符串作爲你的鑰匙,沒有人會注意到它。

儘管如此,通過隱藏的安全通常是由在該領域(他們做了很多皺眉)專家皺起了眉頭。如果你真的在做公共密鑰加密,公開密鑰是完全沒問題的。畢竟,這是關鍵。這是必須保密的私鑰。

如果你真的想這樣做,那麼我會看看一個隨機數生成算法,並將它的一個迭代展開到一個基本上需要一個種子並評估爲一個大型表達式的(大)宏中,該表達式產生一個僞隨機整數作爲其結果。這應該做到這一點。如果種子從編譯時間(__TIME__)等不可預測的事情中衍生出來,它可能會起作用。

+1

隱藏密鑰是必要的。危險不在於某人可能學習私鑰,而是他們可能會用自己選擇的一個替換公鑰,並在其控制下匹配一個不同的私鑰。 –

+0

我不想公開公鑰的原因是因爲它可以用來解密遊戲數據文件。私鑰與文件和引擎保持獨立,這樣任何人都無法制作遊戲數據文件。另外,另一半是防止製造的是@BenVoigt剛纔所說的。 – orangething

+0

但有關使用'__TIME__'的想法聽起來像是一個完美的解決方案,加上隨機性算法。謝謝! – orangething

0

目前還沒有任何蘭德宏或模板元函數,但它可以被創建... ...很多努力。

在另一方面,你可以簡單地觸摸的/ dev /隨機作爲構建過程的一部分,或其他一些隨機源,並創建結果的標題。在你得到一個隨機數字常數的地方包含這個頭部。

+0

好的建議,但在Windows上有相當的?也可以簡單地做#include「/ dev/random」有什麼好處,或者不能像那樣指定路徑? – orangething