Дайджест SHA256 отличается между инициализатором массива и строкой

#c #hash #sha256

#c #хэш #sha256

Вопрос:

Я использую функцию sha256 микросхемы безопасности Microchip ATECC508A. Мой код выглядит следующим образом:

 int main(void) {
    uint8_t message[32] = {0}; // Method 1
    //uint8_t message[32] = "00000000000000000000000000000000"; // Method 2
    foobar(message, sizeof(message));
}

void foobar(uint8_t *message, int length) {
    uint8_t digest[32];
    sha256(message, length, digest);
    // printf statements for calculated hashes ...
}
  

Метод 1: 66687AADF862BD776C8FC18B8E9F8E20089714856EE233B3902A591D0D5F2925

Метод 2: 84E0C0EAFAA95A34C293F278AC52E45CE537BAB5E752A00E6959A13AE103B65A

Метод 2 выдает соответствующий хэш, который я ожидаю для 32 нулей, но когда я использую инициализатор статического массива в методе 1, хэш неверен, и я не знаю почему. Я проверил полученные хэши sha256 здесь.

Я был бы признателен за любую помощь, большое вам спасибо.

Редактировать:

Я смог инициализировать весь массив символами нулей с помощью:

uint8_t message[32] = { [0 ... 31] = '0'} .

Это работает только в компиляторах gcc.

Комментарии:

1. Так что, возможно, он предназначен для работы с ASCII. Вы, конечно, знаете разницу между целыми числами и строками?

2. Можете ли вы вставить ссылку в свой ответ на документацию для sha256() функции, которую вы используете?

3. @Lundin Проблема решена, это был не мой день, в любом случае спасибо.

Ответ №1:

Во втором случае массив заполняется не числом 0, а символом '0' .

В ASCII кодировка для '0' равна 48, поэтому, предполагая, что ваша система использует ASCII, тогда каждый элемент вашего массива имеет значение 48.

Комментарии:

1. Спасибо за ваш ответ, я новичок в программировании на c, и моя основная проблема заключалась в том, что я думал, что инициализатор массива заполнит все значения определенным значением в скобках, но это влияет только на первое, а все остальные позиции инициализируются нулем. Другой проблемой было представление ascii, спасибо!