gpt4 book ai didi

c - 在 C 中使用带有 RSA 的 SHA1 对数据数组进行签名

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:24 25 4
gpt4 key购买 nike

我必须使用带有 RSA 签名的 SHA1 和我在 C 中的私钥来签署一组数据。我正在使用 OpenSSL 库。但是我总是没有 OPENSSL_Applink 错误。我试过以下:

  • 包含applink.c
  • 静态链接库仅包含 libcrypto-1_1.a
  • 调试 applink.c 以查看表的问题
  • 因为我无法包含 applink.c,所以我手动将源代码添加到我的项目中的相同文件名中,这导致应用程序无响应。

我使用的是 eclipseCDT oxygen 版本。我是 openSSL 库的初学者,如果有人知道这样做的好例子,我也想把链接发给我。我还尝试添加 OpenSSL_add_all_digests() 和 OpenSSL_add_all_algorithms(),但没有成功。

注意:这里的代码可能是错误的,但我的问题是当编译器命中 openssl 库项目的第一个自定义函数时崩溃并出现错误 no OPENSSL_Applink,所以这是我的主要问题,而不是修复代码本身。

这是一个代码片段:

int rsaSign(char *in_file, char * sig_file){

char *data = NULL;
int data_len;
unsigned int sig_len;
unsigned char *sig;
int err = -1;

OpenSSL_add_all_digests();
FILE *fd;
EVP_PKEY *priv_key = EVP_PKEY_new();
RSA *privkey = NULL;
printf( "we are here..\n");

if ((fd = fopen(PRIVKEY_FILE, "r")) == NULL){
printf("error reading file\n");
exit(0);
}

privkey = RSA_new();
if (!PEM_read_PrivateKey(fd, &privkey, NULL, NULL))
{
fprintf(stderr, "Error loading RSA Private Key File.\n");
return 2;
}

fclose(fd);

if (!EVP_PKEY_assign_RSA (priv_key, privkey))
{
fprintf(stderr, "EVP_PKEY_assign_RSA: failed.\n");
return 3;
}

if (!priv_key) {
printf("no private key\n");
}
EVP_PKEY_set1_RSA(privkey, priv_key);


EVP_MD_CTX *ctx = EVP_MD_CTX_create();

const EVP_MD *md = EVP_get_digestbyname("SHA1");

if (!md) {
fprintf(stderr, "Error creating message digest");
fprintf(stderr, " object, unknown name?\n");
ERR_print_errors_fp(stderr);
exit(1);
}



if (!EVP_SignInit(ctx, md))
{
fprintf(stderr, "EVP_SignInit: failed.\n");
EVP_PKEY_free(priv_key);
return 3;
}
printf( "now to sign update..\n");
data = readFile(in_file);
data_len = strlen(data);
printf("data len = %d\n", data_len);

if (!EVP_SignUpdate(ctx, data, data_len))
{
fprintf(stderr, "EVP_SignUpdate: failed.\n");
EVP_PKEY_free(priv_key);
return 3;
}
printf( "now to sign final..\n");

sig = malloc(EVP_PKEY_size(privkey)); //!!!!! SEGMENTATION FAULT HERE !!!!!


if (!EVP_SignFinal(ctx, &sig, &sig_len, priv_key))
{
fprintf(stderr, "EVP_SignFinal: failed.\n");
free(sig);
EVP_PKEY_free(priv_key);
return 3;
}

free(data);
free(sig);
EVP_PKEY_free(priv_key);
return EXIT_SUCCESS;

}

最佳答案

您的代码将类型为 RSA**&privkey 传递给 PEM_read_PrivateKey,这需要(根据其原型(prototype))EVP_PKEY**;您的编译器应该已经诊断出这一点。同样,EVP_PKEY_size 需要 EVP_PKEY* 而不是 RSA*。使用通用读取,您根本不需要任何 RSA*,也不需要也不能使用 EVP_PKEY_assign_RSA

如果您的代码(包括对 OpenSSL 的所有调用和 #include "applink.c")在 EXE 中,则 Applink 应该工作> 在 DLL 中——是吗?

但是,通过避免使用 FILE* 和使用 BIO* 形式的 API,即使使用动态链接,您也可以消除对 Applink 的需求 .因此,而不是:

FILE* f = fopen (file,"r");
if( f==NULL ) ...error...
... PEM_read_PrivateKey (f, &evpkey, NULL, NULL) ...
fclose(f);

使用:

BIO* b = BIO_new_file (file,"r");
if( b==NULL ) ...error...
... PEM_read_bio_PrivateKey (b, &evpkey, NULL, NULL) ...
BIO_close(b);

或可能但更笨重:

FILE* f = fopen (file,"r"); if( f==NULL ) ...error...;
char* buf = ...read all data from f into allocated memory...;
int len = ...length of data in buf...;
fclose (f);
BIO* b = BIO_new_mem_buf (buf,len);
... PEM_read_bio_PrivateKey (b, &evpkey, NULL, NULL) ...
... free buf as appropriate ...

PS:我不知道 MinGW 包是否有手册页,但大多数 Windows 包(除了 Cygwin 和现在的 WSL)没有。如果不是,您可能应该添加书签并使用 https://www.openssl.org/docs/manpages.html 下的适当目录.

关于c - 在 C 中使用带有 RSA 的 SHA1 对数据数组进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43985322/

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