2012-06-18 3 views
1

저는 crypto ++ 라이브러리를 사용하여 응용 프로그램을 작성하고 있습니다. ECB_Mode 템플릿 클래스는 익숙하지 않은 사람들을 위해 CipherModeBase에서 상속받습니다. 프로그램이 컴파일되고 실행되지만, 출력이 올바르지 않습니다. cipher_object에서 암호화 메소드를 호출하면 ECB_Mode 객체를 직접 사용하는 것과 같은 방식으로 작동하지 않습니다. 옵션 객체 인스턴스 변수가 올바르게 할당되었는지 확인했습니다. if_then_else 구조체 또는 switch_case 내에 인스턴스를 작성하여 코드를 멋지게 유지하고 DRY 상태로 유지하려고합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?사용자 입력을 기반으로 템플릿에서 객체 만들기

ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
ecbEncryption.processData(args); 

PS :

여기
CipherModeBase *cipher_object; 
    cipher_object == NULL; 

    if(options->cipher == BS_AES) 
    { 
     ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
     cipher_object = &ecbEncryption; 
    } 
    else if(options->cipher == BS_TWOFISH) 
    { 
     ECB_Mode<Twofish >::Encryption ecbEncryption(options->key, options->keylen); 
     cipher_object = &ecbEncryption;  
    } 
cipher_object->processData(args); 

이 작업을 수행 것입니다 : 여기

내가 노력하고 있지만 작동하지 않는 것입니다. 나는 ECB 모드를 사용하지 않는 것을 안다. 나는 모든 것을 작동시킬 때까지 IV를 망치고 싶지 않습니다. 나는 또한 상대적으로 C++에 익숙하지 않다. 여기

답변

1

:

cipher_object == NULL; 

if(options->cipher == BS_AES) 
{ 
    // v 
    ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen); 
    cipher_object = &ecbEncryption; 
} 

ecbEncryption 그 범위에 국부적이다. 로컬의 주소를 저장하고 범위를 벗어난 후 사용합니다. 그건 정의되지 않은 행동입니다. 새 키워드를 사용하여 힙에 할당해야합니다.

if(options->cipher == BS_AES) 
{ 
    cipher_object = new ECB_Mode<AES >::Encryption(options->key, options->keylen); 
} 

다른 if 문에 대해서도 동일한 작업을 수행해야합니다.

cipher_object == NULL; 

이 변경되어야합니다 :

cipher_object = NULL; 

문제는하지만, 위의 코드를 사용하여 해결해야

는 또한이 있습니다.

+0

감사합니다. 그것은 효과가 있었다. 비교 연산자에 대한 좋은 이해, 어쩌면 휴식 시간 ... – user1456786

+0

사용을 마친 후에도 "cipher_object 삭제"를 기억해야합니다. –

2

ecbEncryption 개체는 if 및 else 범위 내의 스택에 선언됩니다. 스코프는 중괄호로 묶인 것입니다.

오브젝트가 종료시 선언 된 범위에서 오브젝트가 삭제됩니다. 따라서 processData를 호출하는 객체는 해당 메소드를 호출하기 전에 삭제되었습니다. 분명히 그것은 작동하지 않을 것입니다.

하나의 옵션은 스택 대신 힙에 객체를 선언 할 수 있다는 것입니다. 그렇게하면 평생을 원하는대로 작동하도록 제어 할 수 있습니다.

원시 포인터 대신 cipher_object에 std :: unique_ptr을 사용하십시오. 그런 조항이에 할당 다른 경우와 같이에서 :

cipher_object.reset(new ECB_Mode<AES>::Encryption(options->key, options->keylen)); 

그런 다음 개체는 unique_ptr가 당신을 위해 그것을 삭제됩니다 지적되는 cipher_object의 범위의 끝 때까지 힙에 남아있게됩니다. 그리고 cipher_object의 범위는 메서드를 호출 할 때까지 지속됩니다.

관련 문제