Как мне добавить биты к строке в C? - PullRequest
0 голосов
/ 16 июня 2019

Я реализую алгоритм sha256 в C. Мне не нужна помощь с алгоритмом. Одной из задач при реализации алгоритма является добавление битов в сообщение таким образом, чтобы длина сообщения составляла 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 голосов
/ 16 июня 2019

Сначала я думал, что заполнение битов в сообщении будет означать добавление к нему нулей.

Существуют алгоритмы, которые ожидают постоянный размер блока, напр.AES или sha256.Их называют буквально «блочные алгоритмы», напр. блочные шифры .При работе с сообщениями короче, чем размер блока, вам нужно чем-то заполнить неиспользованные биты.

Обычно, по соглашению, для простоты они заполнены нулями.Существуют стандарты, в которых говорится, что вы можете дополнять неиспользуемые биты / байты.Иногда они заполнены случайными байтами или как единичные 1, а затем нулями 0000...00 бит и т. Д. См. Пример. эта вики-страница

Клиент должен знать длину сообщения.В случае строк C, я бы просто добавил его нулевыми байтами.В любом случае строки C заканчиваются нулевым байтом, поэтому пользователь может просто strlen(received_message), и он будет знать длину строки.

В случае работы с произвольными данными, вы должны передать длину сообщениякаким-то образом.Может быть, каким-то другим способом или с сообщением, в начале, например.Так, например, вы можете выбрать первые 4 байта для представления длины сообщения.Или вы можете указать, что сообщение начинается со строки C с длиной сообщения, закодированной с использованием числа, представленного в базе 16, с использованием символов ASCII (так что вы можете прочитать длину сообщения с помощью %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;
}

Примечания к вашему коду:

...