2011-01-24 9 views
1

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

答えて

2

リバースエンジニアリングの面から来て、私は気にしないことをお勧めします。あなたのキーはあなたのアプリケーションの中にも格納されなければならないでしょう。シェーダを直接暗号化するよりも、キーを保存する場所とシェーダを暗号化する方法を見つけるのが少し難しくなります。私の経験では、シェーダはあたかもプロプライエタリなコードをそのまま持っているわけではないので、クリアテキストで埋め込むことをお勧めします。

ROT13を実行すると、明らかに簡単になり、「vec3」などのバイナリを検索するだけの簡単な攻撃が阻止されます。

自分自身に質問する必要があるのは、誰があなたのシェーダーソースを見ないようにしようとしていますか?カジュアルオブザーバー?その場合、ROT13で十分かもしれません。熟練したリバースエンジニアですか?それで、インプロセスの暗号化は多くの保護をもたらさないでしょう。

本物のデータを保護し、ネットワーク対応のアプリケーションを作成しようとしている場合は、GPUに送信されるとシェーダをワイヤで送信し、メモリをクリアすることを検討してください。

+0

良い点、フィードバックありがとうございます。ほとんどのユーザーは、オープンソースソフトウェアなどで作業しているユーザーの中間にいると思うので、リバースエンジニアほど深くはない技術レベルに慣れています。アプリケーションがネットワーク化されていないので、より進んだアプローチはうまくいきません...間にはいくつかのテクニックがありますか? – Matthias

関連する問題