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