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