Created
November 17, 2015 13:04
-
-
Save c9n/3751453d5dc1466829c3 to your computer and use it in GitHub Desktop.
openssl RSA demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <openssl/rsa.h> | |
#include <openssl/pem.h> | |
#include <openssl/err.h> | |
#include <stdio.h> | |
#include <string.h> | |
#define KEY_LENGTH 2048 | |
#define PUB_EXP 3 | |
#define PRINT_KEYS | |
#define WRITE_TO_FILE | |
int main(void) { | |
size_t pri_len; // Length of private key | |
size_t pub_len; // Length of public key | |
char *pri_key; // Private key | |
char *pub_key; // Public key | |
char msg[KEY_LENGTH/8]; // Message to encrypt | |
char *encrypt = NULL; // Encrypted message | |
char *decrypt = NULL; // Decrypted message | |
char *err; // Buffer for any error messages | |
// Generate key pair | |
printf("Generating RSA (%d bits) keypair...", KEY_LENGTH); | |
fflush(stdout); | |
RSA *keypair = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL); | |
// To get the C-string PEM form: | |
BIO *pri = BIO_new(BIO_s_mem()); | |
BIO *pub = BIO_new(BIO_s_mem()); | |
PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL); | |
PEM_write_bio_RSAPublicKey(pub, keypair); | |
pri_len = BIO_pending(pri); | |
pub_len = BIO_pending(pub); | |
pri_key = malloc(pri_len + 1); | |
pub_key = malloc(pub_len + 1); | |
BIO_read(pri, pri_key, pri_len); | |
BIO_read(pub, pub_key, pub_len); | |
pri_key[pri_len] = '\0'; | |
pub_key[pub_len] = '\0'; | |
#ifdef PRINT_KEYS | |
printf("\n%s\n%s\n", pri_key, pub_key); | |
#endif | |
printf("done.\n"); | |
// Get the message to encrypt | |
printf("Message to encrypt: "); | |
fgets(msg, KEY_LENGTH-1, stdin); | |
msg[strlen(msg)-1] = '\0'; | |
// Encrypt the message | |
encrypt = malloc(RSA_size(keypair)); | |
int encrypt_len; | |
err = malloc(130); | |
if((encrypt_len = RSA_public_encrypt(strlen(msg)+1, (unsigned char*)msg, (unsigned char*)encrypt, | |
keypair, RSA_PKCS1_OAEP_PADDING)) == -1) { | |
ERR_load_crypto_strings(); | |
ERR_error_string(ERR_get_error(), err); | |
fprintf(stderr, "Error encrypting message: %s\n", err); | |
goto free_stuff; | |
} | |
#ifdef WRITE_TO_FILE | |
// Write the encrypted message to a file | |
FILE *out = fopen("out.bin", "w"); | |
fwrite(encrypt, sizeof(*encrypt), RSA_size(keypair), out); | |
fclose(out); | |
printf("Encrypted message written to file.\n"); | |
free(encrypt); | |
encrypt = NULL; | |
// Read it back | |
printf("Reading back encrypted message and attempting decryption...\n"); | |
encrypt = malloc(RSA_size(keypair)); | |
out = fopen("out.bin", "r"); | |
fread(encrypt, sizeof(*encrypt), RSA_size(keypair), out); | |
fclose(out); | |
#endif | |
// Decrypt it | |
decrypt = malloc(encrypt_len); | |
if(RSA_private_decrypt(encrypt_len, (unsigned char*)encrypt, (unsigned char*)decrypt, | |
keypair, RSA_PKCS1_OAEP_PADDING) == -1) { | |
ERR_load_crypto_strings(); | |
ERR_error_string(ERR_get_error(), err); | |
fprintf(stderr, "Error decrypting message: %s\n", err); | |
goto free_stuff; | |
} | |
printf("Decrypted message: %s\n", decrypt); | |
free_stuff: | |
RSA_free(keypair); | |
BIO_free_all(pub); | |
BIO_free_all(pri); | |
free(pri_key); | |
free(pub_key); | |
free(encrypt); | |
free(decrypt); | |
free(err); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
origin
https://shanetully.com/2012/04/simple-public-key-encryption-with-rsa-and-openssl/