c - 在 C 中将 Int 附加到 char *

标签 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 的长度。由于这更容易获得,因此这部分不是问题。但是,类似地,在我的 decrypt 函数中使用 EVP_DecryptFinal_ex 需要解密的 ciperText 的长度,因此我需要将其存储在某个地方。

在我实现此功能的应用程序中,我所做的就是将一些较差的散列更改为正确的加密。更麻烦的是,应用程序的方式是我首先需要解密从 XML 读取的信息,对其进行处理,然后对其进行加密并再次将其重写为 XML,因此我需要以某种方式将此密码长度存储在密码中。我也没有空间重新设计它。

最佳答案

与您现在所做的不同,将密文大小编码到密文本身之前的位置可能会更明智。一旦开始解密,找到最后的大小就没什么用了。您需要知道末端才能获得尺寸才能找到末端,这不是很有帮助。

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

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

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

关于c - 在 C 中将 Int 附加到 char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529290/

相关文章:

c++ - 混合 C 和 C++ 代码时出现链接错误

mysql - 如果列为空,如何停止使用 CONCAT_WS 添加逗号

python - 如何改进 Pandas 中数组的数据框创建

php - 希望对每个用户的数据库中的数据进行加密

Java 加密框架/工具包

c# - "Padding is invalid and cannot be removed"- 这段代码有什么问题?

c - '没有这样的文件或目录。'但文件在那里

接受默认参数的 C 函数

c - gst_mini_object_init 中的段错误

c++ - C 预处理器替换和连接