繁体   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