Расчет дайджеста файла base64 с помощью openssl - PullRequest
3 голосов
/ 15 февраля 2011

Я пытаюсь найти способ кодирования следующих команд openssl:

Сценарий:

Дано: значение файла в кодировке Base64 (b64.txt)

Записанный в base64 sha1-дайджест файла (ровно 20-байтовый sha1-дайджест этого файла).

Проблема: я должен проверить с помощью программы на C, является ли данный дайджест файла правильным.

Мой метод:

  • Сначала я попробовал команды openssl, чтобы проверить дайджест перед написанием кода.Вот как я это сделал.
  • Сначала я расшифровал этот файл base64, а затем нашел дайджест файла sha1.

Я не был уверен, почему никогда не получал 20-байтовое значениев качестве вывода.И с методом проб и ошибок работали только они:

В системе linux я сделал следующее:

  • base64 -d b64.txt > dec.out (dec.out представлял собой смесь текстового и двоичного (неразборчиво)текст)
  • openssl dgst -sha1 -binary dec.out > sha1.bin (я обнаружил дайджест в двоичной форме, принимая dec.out в качестве двоичного ввода)
  • base64 sha1.bin > sha1.b64 (кодирование результата sha1 в base64)

Теперь мой sha1.b64 дал 20-байтовый дайджест, который был таким же, как и тот, который мне дали.

Прежде всего, я хотел бы знать, правильна ли последовательность команд с самого начала иесли есть более простые способы сделать это.

Кроме того, с помощью EVP_Digest * как запрограммировать это (я имею в виду, какой формат ввода файла указан в этих?)

Пожалуйста, уточните.

Спасибо

1 Ответ

1 голос
/ 21 февраля 2011

Эта последовательность команд выглядит правильно. Вы можете упростить его, используя перенаправление оболочки вместо временных файлов:

base64 -d b64.txt | openssl dgst -sha1 -binary | base64

Чтобы сделать то же самое в C с использованием библиотеки OpenSSL, вы можете использовать абстракцию BIO для хорошего эффекта:

#include <stdio.h>
#include <openssl/bio.h>
#include <openssl/evp.h>

int main(int argc, char *argv[])
{
    BIO *bio_in, *b64, *md, *bio_out;
    char buf[1024];
    char mdbuf[EVP_MAX_MD_SIZE];
    int mdlen;

    /* setup input BIO chain */
    bio_in = BIO_new_fp(stdin, BIO_NOCLOSE);

    b64 = BIO_new(BIO_f_base64());
    bio_in = BIO_push(b64, bio_in);

    md = BIO_new(BIO_f_md());
    BIO_set_md(md, EVP_sha1());
    bio_in = BIO_push(md, bio_in);

    /* reading through the MD BIO calculates the digest */
    while (BIO_read(bio_in, buf, sizeof buf) > 0)
        ;

    /* retrieve the message digest */
    mdlen = BIO_gets(md, mdbuf, sizeof mdbuf);

    /* setup output BIO chain */
    bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);

    b64 = BIO_new(BIO_f_base64());
    bio_out = BIO_push(b64, bio_out);

    /* write out digest */
    BIO_write(bio_out, mdbuf, mdlen);
    BIO_flush(bio_out);

    BIO_free_all(bio_in);
    BIO_free_all(bio_out);

    return 0;
}

Вышеуказанная программа будет читать ввод base64 на stdin и записывать хэш SHA1 в кодировке base64 в stdout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...