簡體   English   中英

在C中將Int附加到char *

[英]Appending an Int to a char * in C

因此,我希望將密碼文本的長度附加到要存儲密碼的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需要decryptciperText的長度,因此我需要將其存儲在某個地方。

在我要實現此功能的應用程序中,我所要做的就是將一些不良的哈希更改為適當的加密。 為了增加麻煩,我首先需要解密從XML讀取的信息,對其進行處理,然后對其進行加密,然后再次將其重寫為XML,因此,我需要將此密碼長度以某種方式存儲在密碼中。 我也沒有范圍重新設計它。

我希望您有足夠大的數組供cipherText和cipheLegthChar存儲所需的文本。 因此,代替

unsigned char *cipherText = NULL;

你可以有

unsigned char cipherText[MAX_TEXT];

類似地

cipherLenghthChar[MAX_INT];

或者,您可以動態分配它們。

其中MAX_TEXT和MAX_INT最大緩沖區大小,用於存儲文本和整數。 同樣,在第一次調用EVP_EncryptFinal_ex NULL之后,終止cipherText,以便您使用strcat。

問題是我不認為在處理二進制數據時使用strcat不會帶來麻煩。

正確! 但是,這不是您唯一的問題:

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

即使此處的cipherTextLength為0,您也已經超出范圍,因為sprintf將添加一個空終止符,總共兩個字符-但是cipherLengthChar僅可容納一個字符。 如果考慮將4294967295作為字符串,則為10個字符+ '\\0' = 11個字符。

看來finalBlockLength是放入cipherText的數據的長度。 但是,由於cipherText == NULL ,因此EVP_EncryptFinal_ex()調用可能會以一種或另一種方式失敗,或者至少不會執行您想要的操作。 然后,向其添加0(== 0,又稱NULL)並將其作為參數提交。 您要么需要一個指向那里的指針的指針(如果EVP_EncryptFinal_ex將為您分配空間),要么您必須確保cipherText有足夠的空間開始。

關於將文本(或其他內容)添加到末尾,您可以直接使用sprintf:

sprintf(cipherText + finalBlockLength, "%d", cipherTextLength);

假定cipherText為非NULL並在其中有足夠的額外空間(請參閱前幾段)。

但是,我非常懷疑這樣做在以后會很有用,但是由於我沒有更多的背景信息,所以我不能說更多。

將密文的大小編碼到密文本身之前的某個位置可能比現在更聰明。 一旦開始解密,在末尾查找大小並不是很有用。 您需要知道目標的大小才能找到目標,不是很有幫助。

此外,密文是二進制的,因此您無需將任何內容轉換為字符串。 您想將其轉換為固定數量的字節(否則您不知道size:P的大小)。 因此,創建一個更大的緩沖區(比密文需要的緩沖區多4個字節),然后開始加密以抵消4個轉發。 然后在緩沖區的開始處復制密文的大小。

如果您不知道如何編碼整數,請查看-例如- 這個問題/答案 請注意,對於密文的最大大小2^32 (大約4 GiB),這將僅編碼32位。 此外,該鏈接指向使用Big Endian編碼。 您應該使用Big Endian(首選加密代碼)或Little Endian編碼-但不要將兩者混用。

密文和編碼大小都不能用作字符串。 如果您需要一個字符串,我的建議是對緩沖區進行base 64編碼直到密文的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM