我有一个包含二进制加密字符串的char *(使用AES-128这是加密输出)。
我需要弄清楚char *中有多少字节(因为AES 128使用16字节的块大小,它应该是16的倍数)。确定包含二进制数据的char *大小的最佳方法是什么? Strlen和sizeof似乎没有在这里产生正确的结果(结果不是16的增量)。当我在0和一些任意大数字之间循环使用i时,我可以通过简单地执行printf(“%d”,ptr [i])来循环遍历字符串的ascii值。
这里有什么想法吗?
答案 0 :(得分:5)
char*
没有为它在C中指向的缓冲区定义的显式大小。它只是缓冲区中第一个char
的地址,仅此而已。如果需要缓冲区的大小,请将其传递给单独的变量,如下所示:
void decryptBuffer(char* buffer, size_t n)
注意:sizeof(buffer)
只会给你指针的大小,而不是它指向的字节数!
答案 1 :(得分:0)
无法知道加密字符串的长度。您知道它超过16字节且小于缓冲区大小。你必须知道块的数量。
话虽如此,如果你真的无法获得块的数量,尝试解密16bytes,并检查它是否是你需要的。如果没有,解密32字节并执行检查直到缓冲区结束或直到你有你需要的为止。
答案 2 :(得分:0)
char *的大小取决于计算机的地址总线长度,并存储在程序的堆栈中。例如,32位指针的大小应为4个字节。事实上,您可以使用sizeof(char *)找到它。
char *指向一个内存地址,你不仅可以知道分配的块是什么。如果在那个地址你实际上有一个字符串,你可以直到你到达字符串终结符'\ 0'。但是,如果它只指向二进制数据,我的解决方案是在编码字符串的开头编码数据的长度,并将其用作标题,以便您知道何时停止。
但是你是怎么在内存中获得加密对象的呢?你没有使用某种结构吗?我猜你把加密的字符串存储为字符串。
请提供更多详情..
答案 3 :(得分:0)
正如其他人所指出的那样,没有办法弄清楚char *
指向的字节数。
AES-128算法以16字节为单位加密数据,如果输入字符串不是16字节的倍数,算法将使用填充方案。
因此,如果您的输入是16字节的倍数,则加密输出中的位数将等于输入字符串中的位数。如果没有,那么它将填充到最近的16字节块。你真的需要输入字符串的大小来解决这个问题。