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

时间:2019-06-16 15:25:32

标签: c padding sha256

我正在用C实现sha256算法。我不需要该算法的帮助。实现算法的任务之一是将比特填充到消息中,以使消息长度为512位或长度为512位的倍数。

最初,我认为将比特填充到消息中仅意味着将比特填充为零。但是由于该消息是字符消息(字符串),所以我认为我的逻辑不正确。

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

    #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;
    }

1 个答案:

答案 0 :(得分:0)

  

我最初以为消息中的填充位只是将其填充为零。

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

通常,为了方便起见,通常为零填充。有一些标准说明您可以填充未使用的位/字节。有时,它们用随机字节填充,或者用单个1填充,然后用0000...00位填充零,以此类推。 this wiki page

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

如果要处理任意数据,则必须以某种方式传递消息的长度。例如,也许以其他方式或在消息开头带有消息。因此,例如,您可以选择前4个字节来表示消息长度。或者,您可以指定消息以C字符串开头,消息长度使用以ASCII字符为底数16表示的数字编码(因此您可以使用%x读取消息长度),并在字符串之后继续发送消息。

  

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

只需使用msgcalloc用零初始化meset存储器:

#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;
}

代码注释: