C/C++プログラムで文字列として使用されるテキスト情報(私の場合はGLSLシェーダ)をバイナリ内で直接読み取ることができないようにしたいと思います。したがって、コンパイル/ビルド時にファイルを暗号化し、実行時にデータを復号化して再構築されたシェーダを続けることを考えました。コンソールとライブラリとしてopensslを組み合わせる際の問題
しかし、Cプログラムのライブラリ(evp)と一緒にコンソール上でopensslを入手するのにはいくつか問題があります。
// 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