- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 OpenSSL 为文件创建签名。我相信我的结果应该与 openssl 生成的 testfile.sig 相匹配:
$ openssl dgst -sha1 -binary < testfile > testfile.sha1
$ openssl rsautl -sign -in testfile.sha1 -inkey rsa_private.pem -keyform PEM -out testfile.sig
$ openssl rsautl -verify -inkey rsa_public.pem -pubin -in testfile.sig -hexdump
Loading 'screen' into random state - done
0000 - 9f 23 88 15 2b af d6 a6-9f 4f 1f 7e ee b0 90 dd .#..+....O.~....
0010 - 69 99 2b 3d i.+=
所以,我使用了caf发布在这里的代码: How to read key file for use with HMAC_Init_ex()只是添加了一小块来将 EVP_SignFinal() 之后的数据保存到文件中,所以我可以用 openssl 和公钥验证它:
FILE * fp = fopen("out.sig", "wb");
if (fp) {
printf("Writing the signature in a file. # of bytes: %u.\n", sig_len);
fwrite(sig, 1, sig_len, fp);
fclose(fp);
}
令我惊讶的是,我得到了这个:
$ openssl rsautl -verify -inkey rsa_public.pem -pubin -in out.sig -hexdump
Loading 'screen' into random state - done
0000 - 30 21 30 09 06 05 2b 0e-03 02 1a 05 00 04 14 9f 0!0...+.........
0010 - 23 88 15 2b af d6 a6 9f-4f 1f 7e ee b0 90 dd 69 #..+....O.~....i
0020 - 99 2b 3d .+=
现在,如果您观察 out.sig 验证的输出,您将看到最后 20bytes 与 testfile.sig 验证的数据输出相匹配。这 20 个字节是确实是我文件的 SHA-1 哈希值。但开头的前 15 个字节是什么?EVP_SignInit()/EVP_SignUpdate()/EVP_SignFinal() 不应该只将哈希值放入消息,还是我遗漏了一些明显的东西?
如果您需要更多信息,请告诉我。谢谢
用于签署文件的完整函数:
int do_evp_sign(FILE * rsa_pkey_file, FILE * in_file)
{
OpenSSL_add_all_digests();
ERR_load_crypto_strings();
EVP_PKEY * pkey = PEM_read_PrivateKey(rsa_pkey_file, NULL, NULL, NULL);
if (pkey == NULL) {
ERR_print_errors_fp(stderr);
return 1;
}
fseek(in_file, 0, SEEK_END);
const size_t lSize = ftell(in_file);
rewind(in_file);
EVP_MD_CTX md_ctx;
EVP_SignInit(&md_ctx, EVP_sha1());
size_t len;
unsigned char buffer[4096];
size_t bytesLeft = lSize;
while (bytesLeft > 0) {
const size_t count = (bytesLeft > sizeof(buffer) ? sizeof(buffer) : bytesLeft);
len = fread(buffer, 1, count, in_file);
if (len != count) {
fprintf(stderr, "Read error! len (%u) != count (%u).\n", len, count);
EVP_PKEY_free(pkey);
return 1;
}
if (!EVP_SignUpdate(&md_ctx, buffer, len))
{
ERR_print_errors_fp(stderr);
EVP_PKEY_free(pkey);
return 1;
}
bytesLeft -= len;
}
unsigned int sig_len;
unsigned char * sig = (unsigned char *)malloc(EVP_PKEY_size(pkey));
if (!sig) {
fprintf(stderr, "Couldn't allocate %u bytes of memory.\n", EVP_PKEY_size(pkey));
EVP_PKEY_free(pkey);
return 1;
}
if (!EVP_SignFinal(&md_ctx, sig, &sig_len, pkey))
{
ERR_print_errors_fp(stderr);
EVP_PKEY_free(pkey);
free(sig);
return 1;
}
FILE * fTemp = fopen("out.sig", "wb");
if (fTemp) {
printf("Writing the signature to a file. Number of bytes: %u.\n", sig_len);
fwrite(sig, 1, sig_len, fTemp);
fclose(fTemp);
}
printf("Signature: \n");
for (unsigned int i = 0; i != sig_len; ++i)
{
printf("%02x", sig[i]);
if (i % 16 == 15)
printf("\n");
}
printf("\n");
EVP_PKEY_free(pkey);
free(sig);
return 0;
}
最佳答案
您拥有的是哈希值的 ASN.1 编码。
0000 - 30 21 30 09 06 05 2b 0e-03 02 1a 05 00 04 14 9f 0!0...+.........
0010 - 23 88 15 2b af d6 a6 9f-4f 1f 7e ee b0 90 dd 69 #..+....O.~....i
0020 - 99 2b 3d .+=
30 - SEQUENCE
21 - length (33 bytes)
30 - SEQUENCE
09 - length (9 bytes)
06 - OID
05 - length (5 bytes)
2b 0e 03 02 1a = 1 2 14 3 2 26 = SHA-1
05 - NULL
00 - length (0 bytes)
04 - Octet String
14 - length (20 bytes)
9f ... 3d - contents (the digest)
您到底是如何生成摘要的(以代码形式)?看起来您使用的任何内容都将其转换为 ASN.1,而不是保留“原始”,这就是您签名的内容。
关于c - 如何使用 libssl 对文件进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781069/
我正在将开发环境从 Ubuntu 10.04 迁移到 Ubuntu 12.04。一个问题是 lib openssl 已从版本 0.9.8 升级到 1.xxx。 我从其他问题中得到了很多有用的提示,但现
我有一个应用程序: export LD_LIBRARY_PATH=/this/is/another/folder ldd myApp // ... libssl.so.10 => /usr/lib64
这是关于在我的系统中运行 WRF 模型的引用。我正在尝试运行文件 plotgrids.ncl 以确保域在运行 geogrid.exe 之前位于正确的位置。在我的终端(ubuntu)中运行以下命令ncl
我一直在使用 MEAN 堆栈为网站运行 NodeJS 服务器,并且已经运行了几个月。当我今天早上再次开始工作时,我启动了网站: nodemon server/app.js 快速服务器启动得很好,但是当
我有一个使用 python:3(基于 debian)的 docker 文件。我正在根据 microsoft docs. 安装 PyODBC 的驱动程序 FROM python:3 RUN curl h
我想在我的 Ubuntu 18.04 上安装 rabbitmq。我一直关注官方documentation .但是,我的安装没有完成,因为我卡在这一步:sudo apt-get install rabb
我有一个非常简单的代码: #include int main() { SHA_CTX sha1; SHA_Init(&sha1); } 我已经安装了 libssl-dev 和 lib
无论我输入什么与“openssl”组合,我总是会收到以下错误消息: 'openssl: error while loading shared libraries: libssl.so.3: canno
我想使用 OpenSSL 为文件创建签名。我相信我的结果应该与 openssl 生成的 testfile.sig 相匹配: $ openssl dgst -sha1 -binary testfile
我正在将我在 Linux 中开发的应用程序移植到 Windows,但在构建该应用程序时遇到了一些问题。在进行必要的代码更改后,一切都可以正常编译(并且在 Visual Studio 中作为调试版本构建
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
尝试启动 puma 时出现以下错误。它提示它无法加载 libssl? 有什么想法吗? root@7711398a00ad:/app# bundle exec puma -C config/puma.r
我正在尝试安装 Siege在 Mac OS 10.12 上使用 libssl,但是当我针对 https 使用该实用程序时url 我收到以下错误。 [error] HTTPS requires libs
在带有 apt install 的 Ubuntu 18.04 上我安装了libssl1.0.0和 libssl1.0-dev . 以下共享对象可用: /usr/lib/x86_64-linux-gnu
我使用 编译了 libssl CC="gcc34 -fPIC" CXX="g++34 -fPIC" CFLAGS="-m64 -fPIC" ./config --prefix=/workspace/l
我在 xcode 5 中有一个引用 libSSL.a 的项目,所以我尝试自己构建它。make 命令的错误信息是这样的: 我做了什么: 1、下载并安装命令行工具(从here下载) 2、从openssl.
您好,我正在尝试使用 libssl 通过 libssl 中的 RSA_padding_add_PKCS1_type1 函数获取一些 EMSA_PSS_ENCODING,但我找不到文档或解决方案,所以这
这更像是一个假设,而我正在调试一些代码。假设我有一个应用程序(称为 X)调用一个库以通过 TLS 加密的 SMTP 连接发送电子邮件,同时 X 正在与另一个库交谈,该库通过相同的 libcrypto
我无法获取 siege使用 https。在预装 OpenSSL 1.0.2g 和 libssl-dev 1.0.2g-1ubuntu4.6 的 Ubuntu 16.04 LTS 上运行 Siege 4
假设以下代码,我的 base64 编码中有奇怪的错误。 #include #include #include #include char * base64(unsigned char * in
我是一名优秀的程序员,十分优秀!