使用openssl计算base64文件摘要

时间:2011-02-15 09:28:01

标签: c openssl

我试图找出编写以下openssl命令的方法:

场景:

给定:文件的Base64编码值(b64.txt)

文件的Base64编码sha1摘要(此文件的正好20字节sha1摘要)。

问题:我必须使用C程序验证文件的给定摘要是否正确。

我的方法:

  • 我首先尝试使用openssl命令在编写代码之前验证摘要。我就是这样做的。
  • 我先解码了这个base64文件,然后找到了该文件的sha1摘要。

我不知道为什么我从来没有得到20byte的值作为输出。通过反复试验,只有这些工作:

在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提供了一个20byte的摘要,与给我的相同。

首先,我想知道命令序列是否正确,以及是否有更简单的方法。

另外,使用EVP_Digest *如何编程(我的意思是在这些文件中指定了什么输入格式?)

请澄清。

由于

1 个答案:

答案 0 :(得分:1)

这一系列命令看起来是正确的。您可以使用shell重定向而不是临时文件来简化它:

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

要使用OpenSSL库在C中执行相同的操作,您可以使用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;
}

上述程序将读取stdin上的base64输入,并将base64编码的SHA1哈希写入stdout