Есть два ключа: 1) openssl genrsa -out file_priv.pem 1024 2) openssl rsa -pubout -in file_priv.pem -out file_pub.pem Программа из примеров openssl написана для сертификатов. Текст:
#include <stdio.h> #include <openssl/rsa.h> #include <openssl/evp.h> #include <openssl/objects.h> #include <openssl/x509.h> #include <openssl/err.h> #include <openssl/pem.h> #include <openssl/ssl.h>
int main () { int err; int sig_len; unsigned char sig_buf [4096]; static char certfile[] = "cert.pem"; static char keyfile[] = "key.pem"; static char data[] = "str";
EVP_MD_CTX md_ctx; EVP_PKEY * pkey; FILE * fp,*fp2; X509 * x509;
/* Just load the crypto library error strings, * SSL_load_error_strings() loads the crypto AND the SSL ones */ /* SSL_load_error_strings();*/ ERR_load_crypto_strings();
/* Read private key */ fp2= fopen (sign2, "r+"); fp = fopen (keyfile, "r"); if (fp == NULL) exit (1); pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL); fclose (fp);
if (pkey == NULL) { ERR_print_errors_fp (stderr); exit (1); }
/* Do the signature */
EVP_SignInit (&md_ctx, EVP_sha1()); EVP_SignUpdate (&md_ctx, data, strlen(data)); sig_len = sizeof(sig_buf); err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);
if (err != 1) { ERR_print_errors_fp(stderr); exit (1); }
EVP_PKEY_free (pkey);
/* Read public key */
fp = fopen (certfile, "r"); if (fp == NULL) exit (1); x509 = PEM_read_X509(fp, NULL, NULL, NULL); //x509 = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL); fclose (fp);
if (x509 == NULL) { ERR_print_errors_fp (stderr); exit (1); }
/* Get public key - eay */ pkey=X509_get_pubkey(x509); if (pkey == NULL) { ERR_print_errors_fp (stderr); exit (1); }
/* Verify the signature */
EVP_VerifyInit (&md_ctx, EVP_sha1()); EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data)); err = EVP_VerifyFinal (&md_ctx, sig_buf, sig_len, pkey); EVP_PKEY_free (pkey);
if (err != 1) { ERR_print_errors_fp (stderr); exit (1); } printf ("Signature Verified Ok.\n"); return(0); }
Как нужно ее модифицировать,чтобы она работала с вышеописанными ключами. Какие функции использовать вместо x509 = PEM_read_X509(fp, NULL, NULL, NULL)? При изменении выдает ошибку
15316:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:642:Expecting: RSA PUBLIC KEY
Сменил функцию x509 на
RSA *pubkey2; pubkey2 = PEM_read_RSAPublicKey(fp, &pubkey, NULL, NULL);
. Выдает
32054:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:642:Expecting: RSA PUBLIC KEY
Какие функции исползовать вместо
EVP_VerifyInit (&md_ctx, EVP_sha1()); EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data)); err = EVP_VerifyFinal (&md_ctx, sig_buf, sig_len, pubkey2); EVP_PKEY_free (pubkey2);
Может у кого есть пример рабочий. сегодня, 10:59 [2954167] Цитировать