我正在用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;
}
答案 0 :(得分:0)
我最初以为消息中的填充位只是将其填充为零。
有些算法期望块的大小恒定,例如。 AES或sha256。从字面上看,它们被称为“块算法”。 block ciphers。当处理的消息短于块的大小时,您必须用一些东西填充未使用的位。
通常,为了方便起见,通常为零填充。有一些标准说明您可以填充未使用的位/字节。有时,它们用随机字节填充,或者用单个1
填充,然后用0000...00
位填充零,以此类推。 this wiki page
客户端必须知道消息的长度。如果是C字符串,我将用零字节填充它。 C字符串无论如何都以零字节结尾,因此用户只需strlen(received_message)
,他就会知道字符串的长度。
如果要处理任意数据,则必须以某种方式传递消息的长度。例如,也许以其他方式或在消息开头带有消息。因此,例如,您可以选择前4个字节来表示消息长度。或者,您可以指定消息以C字符串开头,消息长度使用以ASCII字符为底数16表示的数字编码(因此您可以使用%x
读取消息长度),并在字符串之后继续发送消息。
如何将位填充到C中的字符串?
只需使用msg
或calloc
用零初始化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;
}
代码注释:
%s
与scanf
一起使用。