所以我希望将密文的长度附加到我存储密码的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,所以我需要以某种方式将这个密码长度存储在密码中。我也没有空间重新设计它。
答案 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位缓冲区编码到密文的末尾。