2013-08-30 3 views
0

그래서 암호를 저장하고있는 char 배열의 끝 부분에 암호 텍스트의 길이를 추가하려고합니다. C와는 네이티브가 아닙니다. 내가 생각한 것의 시험 발췌 문장은 라고 생각합니다.Int를 char *에 C로 덧붙임

... 
int cipherTextLength = 0; 
unsigned char *cipherText = NULL; 
... 
EVP_EncryptFinal_ex(&encryptCtx, cipherText + cipherTextLength, &finalBlockLength); 
cipherTextLength += finalBlockLength; 
EVP_CIPHER_CTX_cleanup(&encryptCtx); 

// Append the length of the cipher text onto the end of the cipher text 
// Note, the length stored will never be anywhere near 4294967295 
char cipherLengthChar[1]; 
sprintf(cipherLengthChar, "%d", cipherTextLength); 
strcat(cipherText, cipherLengthChar); 
printf("ENC - cipherTextLength: %d\n", cipherTextLength); 
... 

문제는 내가 이진 데이터가없는 문제가 될 것입니다 처리 할 때 strcat를 사용하여 생각하지 않는 것입니다. 누구든지이 일을하는 더 좋은 방법을 제안 할 수 있습니까?

감사합니다.

편집

좋아, 그래서 내가 길이를 추가 할 찾고 있었던 이유에 대해 약간의 컨텍스트를 추가합니다. 내 encrypt 함수에서 EVP_EncryptUpdate 함수는 암호화 된 plainText 길이가 필요합니다. 이 방법이 훨씬 쉽기 때문에이 부분은 문제가되지 않습니다. 그러나 마찬가지로 decrypt 함수에 EVP_DecryptFinal_ex을 사용하려면 ciperText의 길이가 해독되어야하므로 어딘가에 저장해야합니다.

내가 이것을 구현하는 응용 프로그램에서 내가하고있는 일은 가난한 해싱을 적절한 암호화로 변경하는 것입니다. 추가 번거 로움을 추가하려면 애플리케이션에서 먼저 XML에서 읽은 정보를 해독 한 다음 그 내용을 암호화하고 XML로 다시 작성해야합니다. 따라서이 암호 길이를 어떻게 든 암호에 저장해야합니다. 나는 또한 이것을 재 설계 할 수있는 범위가 없다.

답변

0

지금하는 일 대신 암호문 크기를 앞에 전에 암호문을 암호화하는 것이 더 현명 할 수 있습니다. 해독을 시작하면 끝에 크기를 찾는 것이 그리 유용하지 않습니다. 끝을 찾기 위해 크기를 얻으려면 끝을 알아야합니다.별로 도움이되지 않습니다.

또한 암호문은 이진이므로 아무 것도 문자열로 변환 할 필요가 없습니다. 고정 된 수의 바이트로 변환하려고합니다 (그렇지 않으면 크기의 크기를 알 수 없습니다 : P). 따라서 더 큰 버퍼 (암호문에 필요한 것보다 4 바이트 이상)를 만들고 4 개의 전달을 상쇄하기 위해 암호화를 시작하십시오. 그런 다음 버퍼 시작 부분에있는 암호문의 크기를 복사하십시오.

정수를 인코딩하는 방법을 모른다면 - 예 : this question/ answer을보십시오. 약 4 GiB 인 암호문의 최대 크기 인 2^32에 대해서만 32 비트를 인코딩합니다. 또한 링크는 Big Endian 인코딩을 사용하도록 지정했습니다. Big Endian (암호화 코드로 선호) 또는 Little Endian 인코딩을 사용해야하지만 둘을 섞어서는 안됩니다.

암호문이나 인코딩 된 크기를 문자열로 사용해서는 안됩니다. 문자열이 필요하다면 64 비트를 암호문의 끝까지 기저부에 넣는 것이 좋습니다.

+0

다른 의견을 읽은 후에 나는 길이를 앞에 붙이기로 결정했습니다. 나는 암호문을 시작할 위치를 알 수 있도록 버퍼를 상쇄하는 아이디어를 좋아한다. 이것에 대해 고마워! – MeanwhileInHell

0

필요한 텍스트를 저장하기 위해 cipherText와 cipheLegthChar 둘 다 큰 배열을 사용하기를 바랍니다. 따라서 대신

unsigned char *cipherText = NULL; 

의 당신은

cipherLenghthChar[MAX_INT]; 

에 대한 유사

unsigned char cipherText[MAX_TEXT]; 

을 가질 수 있습니다 또는 당신은 그들이 동적으로 할당 할 수 있습니다.

여기서 MAX_TEXT 및 MAX_INT는 텍스트 및 정수를 저장할 최대 버퍼 크기입니다. 또한 EVP_EncryptFinal_ex의 첫 번째 호출 후 strcat이 작동하도록 cipherText를 종료합니다.

0

이진 데이터를 처리 할 때 strcat를 사용하는 것이 문제가되지 않는다고 생각합니다.

맞음! 즉하지만 유일한 문제가 아니에요 : 여기에 0

// Note, the length stored will never be anywhere near 4294967295 
char cipherLengthChar[1]; 
sprintf(cipherLengthChar, "%d", cipherTextLength); 

에도 cipherTextLength 경우, 당신은 sprintf이 널 (NULL) 종료를 추가하기 때문에, 경계에서 사라 두 문자의 총을했습니다 -하지만 cipherLengthChar는 공간이 하나를 위해. 예를 들어 4294967295, 문자열로 10 문자 + '\0' = 11 자입니다.

finalBlockLength은 데이터 길이가 cipherText 인 것처럼 보입니다. 그러나 EVP_EncryptFinal_ex() 전화는 아마도 어떤 방식 으로든 실패하거나 적어도 cipherText == NULL 이후 원하는대로하지 못할 것입니다.그런 다음 0을 추가 (== 0 aka. 여전히 NULL)하고 매개 변수로 제출하십시오. 포인터에 대한 포인터가 있어야합니다 (EVP_EncryptFinal_ex이 공간을 할당 할 경우). 그렇지 않으면 cipherText에 충분한 공간이 있어야합니다. 마지막에 텍스트를 시침 (또는 무엇이든)과 관련하여

, 당신은 바로 사용할 수 있습니다 직접 sprintf와 :

cipherText 비 NULL이며 충분히 추가 공간이 있다고 가정하면
sprintf(cipherText + finalBlockLength, "%d", cipherTextLength); 

(첫 번째 참조 단락 몇 개).

그러나 나는 그 일을 나중에하는 것이 유용 할 것이라고 매우 의심 스럽지만, 더 이상의 컨텍스트가 없으므로 나는 더 말할 수 없다.

관련 문제