2011-01-24 24 views
1

我想隱藏在C/C++程序中用作字符串的文本信息(在我的情況下爲GLSL着色器),因爲它們在二進制文件中可直接讀取。因此,我想在編譯/編譯期間加密文件,並在運行時解密數據以繼續重建着色器。將openssl作爲控制檯和庫結合使用的問題

但是,在控制檯上使openssl與C程序中的庫(evp)一起工作時遇到了一些麻煩。我不得不承認,我絕不是在密碼學方面的專家,但必須要在現在這個話題...

這是我曾嘗試:

// on the console: 
openssl enc -aes-256-cbc -salt -in shader.frag -out shader.frag.enc 

// ... 

// in the program: 

//// read enc file ////  
int lengthIN; 
char * buffer_encIN; 

ifstream is2; 
is2.open("/Path/To/My/Shader/shader.frag.enc", ios::binary); 

// get length of file: 
is2.seekg(0, ios::end); 
lengthIN = is2.tellg(); 
is2.seekg(0, ios::beg); 

// allocate memory: 
buffer_encIN = new char[ lengthIN ]; 

// read data as a block: 
is2.read(buffer_encIN, lengthIN); 
is2.close(); 


//// decryption //// 

char mykey[EVP_MAX_KEY_LENGTH] = "changeit"; // also tried: unsigned char mykey[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
char iv[EVP_MAX_IV_LENGTH] = "01020304"; // also tried: unsigned char iv[] = {1,2,3,4,5,6,7,8}; 
int tmp_len = 0, in_len, out_len=0; 
EVP_CIPHER_CTX ctx; 

in_len = strlen(buffer_encIN); 
char * buffer_dec = new char[ in_len ]; 

// decrypt 
EVP_DecryptInit(&ctx, EVP_aes_256_cbc(), (unsigned char *)mykey, (unsigned char *)iv); 
EVP_DecryptUpdate(&ctx, (unsigned char *)buffer_dec, &out_len, (unsigned char *)buffer_encIN, in_len); 
tmp_len += out_len; 
EVP_DecryptFinal(&ctx, (unsigned char *)&buffer_dec[ out_len ], &out_len); 

printf("Output:\n%s\n", buffer_dec); 

我有兩個問題困在這裏。首先,只有當我使用-nosalt選項時,大部分事情才能很好地發揮作用,而不適用於部署。至少我得到了EVP_DecryptInit和* Update來返回1,但是*最終結果爲0:最後幾個字節被搞亂了。第二,使用完整版本(即鹽)我不能得到的東西和運行在所有:(

簡而言之:這是正確的方法,我只需要做我的作業(特別是幫助鹽/ IV讚賞;)),還是僅僅花費數小時,並沒有比應用一些ROT13方案隱藏字符串更安全?

任何幫助和意見非常感謝!
Matthias

回答

2

從逆向工程的角度來看,我建議不要打擾。您的密鑰也必須存儲在您的應用內,並且只是稍微難以找到您存儲密鑰的位置,以及如何加密着色器,而不是直接訪問着色器。根據我的經驗,着色器沒有那麼多專有代碼,所以我建議你將它嵌入明文中。

做ROT13顯然會更容易,並且阻止了最簡單的人只是搜索你的二進制文件'vec3'或類似的攻擊。

您需要問自己的問題是:您想阻止您查看着色器源代碼的人是誰?不經意的觀察者?在這種情況下,ROT13可能就足夠了。有經驗的逆向工程師?那麼你的進程內加密不會構成太多的保護。

如果您試圖認真保護您的數據,並且正在編寫支持網絡的應用程序,請考慮通過電線發送着色器並在發送到GPU後清除內存。

+0

好點,感謝您的反饋。我認爲大多數用戶都是介於兩者之間的用戶,即使用開源軟件等的用戶,因此被用於某些技術層面 - 但不像逆向工程師那樣深入。由於應用程序沒有聯網,更高級的方法將無法工作......也許有一些技術介於兩者之間? – Matthias 2011-01-24 16:15:38