【问题标题】:Number of bytes in a binary character pointer二进制字符指针中的字节数
【发布时间】:2011-02-25 12:24:51
【问题描述】:

我有一个包含二进制加密字符串的 char *(使用 AES-128,这是加密的输出)。

我需要弄清楚 char * 中有多少字节(因为 AES 128 使用 16 字节块大小,它应该是 16 的倍数)。确定包含二进制数据的 char * 大小的最佳方法是什么? Strlen 和 sizeof 似乎在这里没有产生正确的结果(结果不是 16 的增量)。当我循环使用 0 和任意大数之间的 i 时,我可以通过简单地执行 printf("%d",ptr[i]) 来循环字符串的 ascii 值。

这里有什么想法吗?

【问题讨论】:

    标签: c encryption


    【解决方案1】:

    char* 没有为它在 C 中指向的缓冲区定义明确的大小。它只是缓冲区中第一个 char 的地址,仅此而已。如果您需要缓冲区的大小,请将其传递到单独的变量中,如下所示:

    void decryptBuffer(char* buffer, size_t n)

    注意:sizeof(buffer) 只会给你指针的大小,而不是它指向的字节数!

    【讨论】:

    • 另一个注意事项:strlen(buffer) 为您提供直到第一个 NULL 字节的字节数,它终止了一个 C 字符串。在处理任意二进制数据时,这根本没有意义
    • 什么值作为 n 传递?我该怎么处理decryptBuffer函数中的缓冲区?
    • decryptBuffer 将是您正在编写的函数。无论哪个程序片段调用您的函数,参数 n 都需要设置为chars 中的缓冲区大小。如果你不能不知道缓冲区的大小,那你就不走运了。然后,您可以尝试其他答案中描述的增量技术之一,但您将冒 SIGSEGV 这样做的风险。
    【解决方案2】:

    没有办法知道加密的字符串有多长。您知道它大于 16 字节并且小于缓冲区大小。你必须知道区块的数量。

    话虽如此,如果您真的无法获得块数,请尝试解密 16bytes,并检查它是否是您需要的。如果没有,请解密 32 字节并执行检查,直到缓冲区结束或直到您拥有所需的内容。

    【讨论】:

      【解决方案3】:

      char* 的大小取决于您计算机的地址总线长度,并且存储在程序的堆栈中。例如,一个 32 位的指针应该有 4 个字节的大小。实际上,您可以使用 sizeof(char*) 找到它。

      char* 指向一个内存地址,你不能只知道分配的块是什么。如果在那个地址你实际上有一个字符串,你可以一直阅读,直到你到达字符串终止符'\0'。但是,如果它只是指向二进制数据,我的解决方案是在编码字符串的开头对数据的长度进行编码并将其用作标头,以便您知道何时停止。

      但是你是怎么在内存中得到一个加密对象的呢?你没有使用某种结构吗?我猜您将加密字符串存储为字符串。

      请提供更多详细信息..

      【讨论】:

        【解决方案4】:

        正如其他人指出的那样,无法计算出char * 指向多少字节。

        AES-128 算法以 16 字节块加密数据,如果输入字符串不是 16 字节的倍数,算法将使用填充方案。

        因此,加密输出中的位数将等于输入字符串中的位数,前提是您的输入是 16 字节的倍数。如果不是,那么它将填充到最近的 16 字节块。不过,您确实需要输入字符串的大小来解决这个问题。

        【讨论】:

          猜你喜欢
          • 2020-12-20
          • 1970-01-01
          • 2012-10-03
          • 2012-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-06
          • 1970-01-01
          相关资源
          最近更新 更多