Эта последовательность команд выглядит правильно. Вы можете упростить его, используя перенаправление оболочки вместо временных файлов:
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
.