将Int附加到C中的char *

时间:2013-08-30 09:20:07

标签: c concatenation encryption

所以我希望将密文的长度附加到我存储密码的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的长度。由于这更容易获得,这部分不是问题。但是,类似地,在我的EVP_DecryptFinal_ex函数中使用decrypt需要解密ciperText的长度,因此我需要将其存储在某处。

在我实现此功能的应用程序中,我所做的只是将一些不良哈希改为正确加密。为了进一步增加麻烦,应用程序的方式我首先需要解密从XML读入的信息,用它做一些事情,然后加密它并再次将它重写为XML,所以我需要以某种方式将这个密码长度存储在密码中。我也没有空间重新设计它。

3 个答案:

答案 0 :(得分:0)

我希望你有足够的大数组用于cipherText和cipheLegthChar来存储所需的文本。因此,而不是

unsigned char *cipherText = NULL;

你可以拥有

unsigned char cipherText[MAX_TEXT];

同样适用于

cipherLenghthChar[MAX_INT];

或者你可以动态分配它们。

其中MAX_TEXT和MAX_INT最大缓冲区大小来存储文本和整数。在第一次调用EVP_EncryptFinal_ex之后,NULL终止cipherText,以便strcat正常工作。

答案 1 :(得分:0)

  

问题是我不认为在处理二进制数据时使用strcat会没有问题。

正确!这不是你唯一的问题:

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

即使此处cipherTextLength为0,您也已超出范围,因为sprintf将添加一个空终结符,总共有两个字符 - 但cipherLengthChar只有'\0'一个人的空间。 如果你考虑,例如4294967295,作为一个字符串,即10个字符+ finalBlockLength = 11个字符。

cipherText似乎是放入EVP_EncryptFinal_ex()的数据的长度。但是,cipherText == NULL调用可能会以某种方式失败,或者至少不会执行您想要的操作,因为EVP_EncryptFinal_ex。然后你添加0(== 0 aka。仍为NULL)并将其作为参数提交。你需要一个指向指针的指针(如果cipherText将为你分配空间),否则你必须确保sprintf(cipherText + finalBlockLength, "%d", cipherTextLength); 中有足够的空间来开始。

关于将文本(或其他)添加到最后,您可以直接使用sprintf:

cipherText

假设{{1}}为非NULL并且其中有足够的额外空间(参见前几段)。

但是,我非常怀疑这样做会在以后有用,但由于我没有任何进一步的背景,我不能多说。

答案 2 :(得分:0)

而不是您现在正在做的事情,在密文本身之前将密文大小编码到位置可能更聪明。一旦开始解密,最后找到大小并不是很有用。你需要知道结束才能找到结束的大小,不是很有帮助。

此外,密文是二进制的,因此您无需将任何内容转换为字符串。您想将其转换为固定的字节数(否则您不知道大小的大小:P)。因此,创建一个更大的缓冲区(比密文需要多4个字节),并开始加密以向前偏移4个。然后在缓冲区的开头复制密文的大小。

如果您不知道如何编码整数,请查看 - 例如 - this question/ answer。注意,对于2^32的密文的最大大小,这将仅编码32位,大约4 GiB。此外,该链接指向使用Big Endian编码。您应该使用Big Endian(加密代码首选)或Little Endian编码 - 但不要混用两者。

密文和编码大小都不应该用作字符串。如果你需要一个字符串,我的建议是将64位缓冲区编码到密文的末尾。