gpt4 book ai didi

c - 使用openssl计算base64文件摘要

转载 作者:行者123 更新时间:2023-12-05 01:29:20 30 4
gpt4 key购买 nike

我正在尝试找出编写以下 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* 如何对此进行编程(我的意思是在这些文件中指定的文件输入格式是什么?)

请澄清。

谢谢

最佳答案

该命令序列看起来是正确的。您可以使用 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

关于c - 使用openssl计算base64文件摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001830/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com