2011-01-24 5 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입니다. 끝에있는 몇 바이트가 엉망입니다. 둘째, 정식 버전 (예 : 소금)을 사용하면 전혀 작동하지 않을 수 있습니다. (

간단히 말해서 : 이것은 올바른 접근 방식이며 단지 숙제해야합니다 (es/IV);)), 또는 그냥 시간을 소비하고 문자열을 숨기기 위해 일부 ROT13 체계를 적용하는 것보다 더 많은 보안이 필요하지 않습니까?

많은 도움과 의견을 보내 주시면 감사하겠습니다.
Matthias

답변

2

리버스 엔지니어링 측면에서 볼 때 나는 신경 쓰지 말 것을 제안합니다. 키는 앱 내부에도 저장해야하며, 키를 저장하는 위치와 셰이더를 암호화하는 방법을 찾는 것이 셰이더에서 직접 처리하는 것보다 어렵습니다. 내 경험상 쉐이더는 그 자체로 독점적 인 코드를 가지고 있지 않으므로 일반 텍스트로 쉐이더를 삽입하는 것이 좋습니다.

ROT13을 실행하면 분명히 'vec3'등의 바이너리를 검색하는 사람들이 가장 쉽게 공격 할 수 있습니다.

자신에게 물어야 할 질문은 다음과 같습니다. 누가 쉐이더 소스를 보지 못하도록 막으려 고합니까? 캐주얼 옵저버? 이 경우 ROT13이면 충분할 수 있습니다. 숙련 된 리버스 엔지니어? 그런 다음 in-process 암호화로 보호하지 않습니다.

데이터를 본격적으로 보호하고 네트워크 지원 응용 프로그램을 작성하려는 경우 GPU로 전송 된 후 쉐이더를 무선으로 보내고 메모리를 지우는 것이 좋습니다.

+0

좋은 의견, 의견에 감사드립니다. 나는 대부분의 사용자가 오픈 소스 소프트웨어 등을 사용하는 사용자들 사이에 있기 때문에 기술적 인 수준에 익숙하다고 생각한다. 그러나 리버스 엔지니어만큼 심층적이지는 않다. 응용 프로그램이 네트워크에 연결되어 있지 않으므로 고급 접근 방식이 작동하지 않습니다. 중간에 어떤 기술이있을 수 있습니까? – Matthias

관련 문제