Решил. Всем спасибо.
Код, аналогичный исходному на C с использованием OpenSSL. Код "грязный", поэтому сгодится только в качестве примера. Публичный ключ RSA валидный (специально сгенерировал).
Код | #include <stdio.h> #include <string.h>
#include <openssl/bio.h> #include <openssl/ssl.h> #include <openssl/err.h> #include <openssl/pem.h> #include <openssl/x509.h> #include <openssl/x509_vfy.h>
char *base64(const unsigned char *input, int length){ BIO *bmem, *b64; BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64()); bmem = BIO_new(BIO_s_mem()); b64 = BIO_push(b64, bmem); BIO_write(b64, input, length); BIO_flush(b64); BIO_get_mem_ptr(b64, &bptr);
char *buff = (char *)malloc(bptr->length); memcpy(buff, bptr->data, bptr->length-1); buff[bptr->length-1] = 0;
BIO_free_all(b64);
return buff; }
int main(int argc, char *argv[]){ char *key = "-----BEGIN PUBLIC KEY-----\n\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWtXBDNcAAYdCLEituiU7PHC55w7onfIEcG1Z+iES8TQdf1cAZDf+46D1oD31kctjGJyuDydw6owh9HSX5TWmdK6WSrfncjfZrGdS9APA7zvP1UjEbVNu8n8b0RTlKYDC6UL33C7S4KDvzY4Tq72GkVwOky5PlQRdTBsG1Ss9KhMYKMvto9OFM02ZEKGXASKN7/K9kGS9VqjVUp6apfzfTL5FJoDgtwZaWTOqv1mwLn8vaDmJUd4D2wdx2Rmo/EXxVRnAJ0qZAeg4vwDn5MbPkkTo2xOkG5QlSzxJSPtThm9z+MQKI9/2bPxlmg8TrAxCRsKvJ59wsfsx+WjqxjAeQIDAQAB\ \n\-----END PUBLIC KEY-----"; // valid Base64-encoded RSA public key char message[] = "message";
do{ int keysize=strlen(key); char * encrypted;
RSA * rsa = 0; int encrypted_length;
SSL_library_init(); SSL_load_error_strings();
BIO *keybio = BIO_new_mem_buf(key, keysize); if (0 == keybio){ printf ("SSL ERROR\n"); break; } if (0 == PEM_read_bio_RSA_PUBKEY(keybio, &rsa, 0, 0)){ printf ("SSL ERROR\n"); break; } encrypted=(char*)malloc(RSA_size(rsa)); encrypted_length = RSA_public_encrypt(strlen(message), (unsigned char*)&message[0], (unsigned char*)encrypted, rsa, RSA_PKCS1_PADDING); if (-1 == encrypted_length){ printf ("SSL ERROR\n"); break; } printf("%s\n", base64(encrypted, encrypted_length)); } while (0);
printf("Done.\n"); return (0);
(void)argc; (void)argv; }
|
|