2011-10-02 2 views
2

편집 : 조언을 취한 후 매개 변수 & 유형을 재정렬했습니다. 하지만 digest() 함수를 호출하면 응용 프로그램이 충돌합니까? 어떤 아이디어가 잘못 됐나요? 나는 C++에서 SHA256 알고리즘의 오픈 소스 구현을 사용하고왜 그들은 일반 문자열이나 'char *'가 아닌 'unsigned char *'를 원하십니까

const std::string message = "to be encrypted"; 
unsigned char* hashMessage; 

SHA256::getInstance()->digest(message, hashMessage); // crash occurs here, what am I doing wrong? 
printf("AFTER: n"); //, hashMessage); // line never reached 

. 내 문제는 해싱 될 수 있도록 내 문자열의 부호없는 char * 버전을 전달하는 방법을 이해하는 것입니다.

void SHA256::digest(const std::string &buf, unsigned char *dig) { 
    init(); 
    update(reinterpret_cast<const unsigned char *>(buf.c_str()), static_cast<unsigned int>(buf.length())); 
    final(); 
    digest(dig); 
} 

이 어떻게 부호없는 문자에 (내가 해시 원하는) 내 문자열을 변환 할 수 있습니다 * :

이 내 문자열의 서명 숯불 * 버전이 걸리는 기능은 무엇입니까?

내가 문자열의 내용을 인쇄에 갈 때 내가 만든 다음 코드는 런타임 오류가 발생합니다

const std::string hashOutput; 
char message[] = "to be encrypted"; 

printf("BEFORE: %s bb\n", hashOutput.c_str()); 
SHA256::getInstance()->digest(hashOutput, reinterpret_cast<unsigned char *>(message)); 
printf("AFTER: %s\n", hashOutput.c_str()); // CRASH occurs here 

PS : 나는 SHA256 &의 많은 구현에서 찾고있다 모두가 서명 숯불을 * 해시 할 메시지로. 왜 그들은 그렇게합니까? 왜 char * 또는 문자열 대신?

+1

이 코드는별로 의미가 없습니다. 왜 당신의'message'는 당신의'hashOutput'' const'를 변경할 수 있습니까? 버퍼 오버런을 피하기 위해 무엇을하고 있습니까? 사용중인 라이브러리에 대한 문서에 대한 링크를 추가하십시오. – Mankarse

+0

@Mankarse : 여기 구현 된 sha256 알고리즘을 사용하고 있습니다. http://tinypasswordmanager.googlecode.com/svn – user593747

+0

질문에 이미 답변 해 놓은 질문을 편집하지 마십시오. 여기에 몇 가지 조언이이 질문에 대답한다면, 그 조언을 받아들입니다. 몇 가지 의견에서 해결할 수없는 다른 문제가 발생하면 새로운 질문을하십시오. – sbi

답변

3

unsigned char이 사용되는 이유는 비트 단위 연산, 시프트 및 오버플로에서 동작을 보장한다는 것입니다.

char (signed char에 해당하는 경우)은 이러한 보증을 제공하지 않으므로 문자열의 기본 비트에 직접 작용하는 작업에는 훨씬 유용하지 않습니다.


"왜 충돌합니까?" "당신은 행운아!" 코드에 정의되지 않은 동작이 있습니다. 간단히 말해서 어떤 메모리를 가리 키도록 초기화 된 적이없는 hashMessage 포인터를 통해 쓰고 있습니다. 사용중인 라이브러리의 소스 코드를 조사한 결과 유효한 메모리 블록을 가리키는 포인터는 digest이어야합니다.이 포인터는 적어도 SHA256_DIGEST_SIZEchar입니다.

이 문제를 해결하려면 digest 인수 (hashMessage)로 전달한 포인터가 제대로 초기화되고 충분한 크기의 메모리 블록을 가리키는 지 확인해야합니다.코드에서 :

const std::string message("to be encrypted"); 
unsigned char hashMessage[SHA256_DIGEST_SIZE]; 

SHA256::getInstance()->digest(message, hashMessage); 

//hashMessage should now contain the hash of message. 
6

잘못된 매개 변수 주위의 매개 변수가 있습니다. Buf는 입력 (해시 할 데이터)이고 dig는 출력 다이제스트 (해시)입니다.

또한 해시는 이진 데이터입니다. 화면에 인쇄하기 전에 상기 바이너리 데이터를 문자열 표현으로 변환해야합니다. 일반적으로 사람들은이를 위해 16 진수 문자열을 사용하기로합니다.

+0

아아, 나는 어리 석다. 나는 변화를 만들었다. (편집 참조). 이제 다이제스트라고 부르면 충돌이 발생합니까? – user593747

+0

@ Ryan : 16 진수 또는 16 진수가 적절하게 작동합니다. 나는 다소 더 짧기 때문에 나는 base64를 선호한다. –

-2

SHA256 해시가 어떻게 생성되는지는 모르지만 서명되지 않은 데이터 형식에서 수행해야하는 일종의 산술이 필요할 수 있습니다.

왜 중요한가요? c_str() 메서드를 호출하고 unsigned char*으로 캐스팅하여 문자열 개체에서 char*을 가져옵니다.

관련 문제