2017-02-22 1 views
0

저는 변경할 수없는 기본 메커니즘 인 암호화 라이브러리를 사용하는 일부 소프트웨어를 개발 중입니다. 프로그램을 실행하면 공개 키와 개인 키를 생성하는 데 약 10 분이 걸리고 소프트웨어의 다른 부분을 디버깅 할 때 매우 실망 스럽습니다. 키를 파일에 쓰고 시간을 절약하기 위해 다시 읽으 려합니다. Enc_Key_Ttypedef void* Enc_Key_Tvoid 포인터의 데이터를 파일에 쓰기

내가 읽고 다음과 키를 쓰기를 시도하는 데 사용한 코드로 정의된다

Enc_Key_T secKey = nullptr;

가 (단지 쓰기를 시도 :

그들은 키는 무효 포인터 지금까지 비밀 키) :

#ifdef WriteKey 

    generate_Keys(parameters, &sec_key, &prv_key); 

    FILE * pFile; 
    pFile = fopen("sk.bin", "wb"); 
    fwrite(&sec_key, sizeof(Enc_Key_T), sizeof(&sec_key), pFile); 
    fclose(pFile); 

#else 

    FILE * pFile; 
    long lSize; 
    char * buffer; 
    pFile = fopen("sk.bin", "rb"); 
    if(pFile == NULL) 
     fileError(); 

    fseek (pFile, 0 , SEEK_END); 
    lsize = ftell (pFile); 
    rewind (pFile); 

    buffer = (char *) malloc (sizeof(char)*lSize); 
    if(buffer == NULL) 
     memError(); 

    sec_key = (void *) fread(buffer, 1, lSize, pFile); 

    fclose(pFile); 
    free(buffer); 

#endif 

파일을 쓸 때 64로 나옵니다. 바이트 파일을 읽지 만 비밀 키 포인터에서 다시 읽으면 낮은 값의 메모리 주소로 설정되어 내가 뭔가 잘못하고 있다고 생각하게 만듭니다. 어떻게 할 수 있는지에 대한 예를 찾을 수 없습니다. 나는 밑줄이있는 구조를 만들지 않으므로 그렇게 할 수 있을지조차 모르겠다. 그래서 나는 포인터가 제공하는 위치에 메모리를 할당하려고한다.

키를 생성하는 기본 라이브러리를 건드리지 않고도이 작업을 수행 할 수 있습니까?

+0

적어도 'sizeof (& sec_key)'이상입니다. 'sizeof (sec_key)'여야합니다. –

+0

키 저장 방법을 이해해야합니다. 바로 지금, 당신은 무언가를 알고있는 것을 복사하려고하는 것과 같은 일을합니다. 그러나 종이를 복사하는 방법은 소리를 복사하는 방법과 다릅니다. 당신은 정확히 어디에서 그것을 복사 할 것인지를 아는 것이 필요합니다. –

+0

'Enc_Key_T'의 유형이 클래스인지 아니면 구조체인지 말해 주시겠습니까? 당신이 가지고 있다면 선언을 게시 할 수 있습니까? sizeof는 Enc_Key_T 선언을 보여주지 않으면 도움이되지 않습니다. –

답변

2

간단한 대답 : 일반적으로 제대로 수행 할 수 없습니다.

긴 대답 : 누락 된 것은 구조이므로 메모리 내용을 쓰는 것만으로 Enc_Key_T를 직렬화 할 수 있다고 보장 할 수 없습니다. 또한, 무작위로 추출한 데이터 일지라도 그 길이는 알려져 있지 않습니다.

또한 생성 된 키에 바인딩 된 자체 상태가 라이브러리에 없다는 보장은 없습니다.

코드 문제 :

글을 쓸 때 알려진 길이의 데이터가 없습니다. 쓰여진 데이터는 포인터입니다.

읽을 때 보조 버퍼가 필요하지 않습니다. 게다가 fread는 데이터에 대한 포인터가 아니라 읽은 바이트 수를 반환합니다. 그래서 대신 :

buffer = (char *) malloc (sizeof(char)*lSize); 
if(buffer == NULL) 
    memError(); 

sec_key = (void *) fread(buffer, 1, lSize, pFile); 

당신은 쓸 수 있습니다 :

sec_key = (void *) malloc (lSize); 
if(sec_key == NULL) 
    memError(); 

if (0 == fread(sec_key, 1, lSize, pFile)) { 
    // error 
} 
+0

또한 그는 쓸 바이트 수를 전혀 모릅니다. 당신이 지적한대로, 그가 무엇이든을 썼다는 어떤 보증도 - 그가 프로그램을 다시 실행할 때 존재하지 않을 무언가의 주소일지도 모른다. –

+0

@DavidSchwartz 오. 나는 쓰는 부분 또한 잘못되었다는 것을 놓쳤다. 알려진 길이가 전혀 없습니다. – Lyth

0

난 당신이 내가 제안하고 그 래퍼를 구축 1 시간 투자 할 수 있도록 집중적으로이 응용 프로그램을 디버깅하려고하는 가정합니다.

같이 오래 당신은 기본 구조를 모르는이 라이브러리는 다음을 수행해야 블랙 박스와 같이 : 코멘트에 토론에서

void generate_KeysEx(...){ 
#if DEBUG 
    // return dummy keys 
#else 
    // call this API 
#endif 
} 

void EncryptEx(...){ 
#if DEBUG 
    // return cipher same as plain text 
#else 
    // call this library API 
#endif 
} 
0

이 가능 것처럼 소리가 나지 않는다 라이브러리에서 구조를 캡처하지 않아도되므로 상당한 코드 변경이 필요합니다.

내가 발견 한 매우 해커 솔루션은 런타임 시간을 대폭 단축하는 몇 가지 주요 생성 매개 변수를 변경하는 것이 었습니다.

관련 문제