【问题标题】:How do I pad bits to a string in C?如何将位填充到 C 中的字符串?
【发布时间】:2019-10-30 09:23:38
【问题描述】:

我正在用 C 实现 sha256 算法。我不需要算法方面的帮助。实现算法时的任务之一是向消息中填充位,使消息的长度为 512 位或长度为 512 位的倍数。

我最初认为向消息填充位只是意味着向它填充零。但是由于消息是字符消息(字符串),我认为我的逻辑不正确。

我的代码没有问题。我只是不知道如何将位填充到字符串(代码中的 msg)

    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc,char *argv[])
    {
       char *msg=(char*)malloc(sizeof(char)*512);
       printf("\n Enter a message");
       scanf("%s",msg);
       //I don't know how to pad bits to msg
       return 0;
    }

【问题讨论】:

  • 您的 512 的 malloc 分配 bytes,而不是 bits。那你是什么意思,位还是字节??
  • 我的意思是位而不是字节
  • 抱歉 malloc 错误
  • 编辑:忽略带有 512 的 malloc。将其视为 128
  • 512 是 8 的倍数。因此是字节数的倍数。因此不需要填充位;只发送字节(除非填充位必须是特定值,1 或 0)。

标签: c padding sha256


【解决方案1】:

我最初认为在消息中填充位只是意味着向它填充零。

有些算法期望块的大小恒定,例如。 AES 或 sha256。从字面上看,它们被称为“块算法”,例如。 block ciphers。当处理比块大小更短的消息时,您必须用一些东西填充未使用的位。

通常,按照惯例,为简单起见,它们用零填充。有一些标准说明您可以填充未使用的位/字节。有时它们填充有随机字节或单个1,然后将0000...00 位归零,等等。见前。 this wiki page

客户端必须知道消息的长度。如果是 C 字符串,我会用零字节填充它。 C 字符串无论如何都以零字节结尾,因此用户只需strlen(received_message) 就可以知道字符串的长度。

在处理任意数据的情况下,您必须以某种方式传递消息的长度。例如,可能是其他方式或消息的开头。因此,例如,您可以选择前 4 个字节来表示消息长度。或者,您可以指定消息以 C 字符串开头,消息长度使用 ASCII 字符以基数 16 表示的数字编码(因此您可以使用 %x 读取消息长度),在字符串之后您的消息继续。

如何在 C 中将位填充到字符串中?

只需用零初始化msg 内存,使用callocmeset

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]) {
   char *msg = calloc(128, sizeof(*msg));
   if (msg == NULL) abort();
   printf("\n Enter a message");
   if (scanf("%127s", msg) != 1) abort()
   # bits are padded with zeros, proceed with your algorithm
   return 0;
}

或者你可以只设置内存中未使用的字节:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main(int argc,char *argv[]) {
   char *msg = malloc(128 * sizeof(*msg));
   if (msg == NULL) abort();
   printf("\n Enter a message");
   if (scanf("%127s", msg) != 1) abort();
   memset(&msg[strlen(msg)], 0, 128 - strlen(msg));
   # bits are padded with zeros, proceed with your algorithm
   return 0;
}

代码注释:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多