0

因此,我希望将密文的长度附加到存储密码的 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,因此我需要以某种方式将此密码长度存储在密码中。我也没有空间重新设计这个。

4

3 回答 3

0

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

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

如果您不知道如何对整数进行编码,请查看 - 例如 -这个问题/答案。请注意,这只会对 32 位的密文进行编码,最大大小2^32约为 4 GiB。此外,该链接指向使用 Big Endian 编码。您应该使用 Big Endian(首选加密代码)或 Little Endian 编码 - 但不要将两者混合使用。

密文和编码大小都不能用作字符串。如果您需要一个字符串,我的建议是对缓冲区进行 base 64 编码,直到密文的末尾。

于 2013-08-31T00:43:06.027 回答
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 工作。

于 2013-08-30T09:31:12.443 回答
0

问题是我认为在处理二进制数据时使用 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。但是,EVP_EncryptFinal_ex()调用可能会以一种或另一种方式失败,或者至少不会做你想做的事,因为cipherText == NULL. 然后将 0 添加到该值(== 0 aka。仍然为 NULL)并将其作为参数提交。要么你需要一个指向那里的指针(如果EVP_EncryptFinal_ex要为你分配空间),或者你必须确保有足够的空间cipherText开始。

关于将文本(或其他)附加到末尾,您可以直接使用 sprintf :

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

假设它cipherText是非 NULL 并且有足够的额外空间(参见前几段)。

但是,我很怀疑这样做以后会有用,但是由于我没有任何进一步的上下文,所以我不能说更多。

于 2013-08-30T09:37:02.397 回答