1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <windows.h> #include <openssl\rsa.h> #include <openssl\pem.h> #include <openssl\rand.h> #include <openssl\applink.c> #pragma comment(lib, "libcrypto.lib")
#define PUB_KEY_FILE "pubkey.pem" #define PRI_KEY_FILE "prikey.pem"
void generate_rsa_key() { RSA* keypair = RSA_generate_key(1024, RSA_F4, NULL, NULL);
BIO* pri = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL); size_t pri_len = BIO_pending(pri); char* pri_key = (char*)calloc(pri_len + 1, sizeof(char)); BIO_read(pri, pri_key, pri_len); FILE* private_file = nullptr; if (fopen_s(&private_file, PRI_KEY_FILE, "w") == NULL) { if (pri_key && private_file) { fputs(pri_key, private_file); fclose(private_file); } }
BIO* pub = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPublicKey(pub, keypair); size_t pub_len = BIO_pending(pub); char* pub_key = (char*)calloc(pub_len + 1, sizeof(char)); BIO_read(pub, pub_key, pub_len); FILE* public_file = nullptr; if (fopen_s(&public_file, PUB_KEY_FILE, "w") == NULL) { if (pub_key && public_file) { fputs(pub_key, public_file); fclose(public_file); } }
RSA_free(keypair); BIO_free_all(pub); BIO_free_all(pri);
free(pri_key); free(pub_key); }
RSA* get_public_key() { FILE* public_file = nullptr; if (fopen_s(&public_file, PUB_KEY_FILE, "r") == NULL) { RSA* rsa = PEM_read_RSAPublicKey(public_file, NULL, NULL, NULL); if(public_file) fclose(public_file); return rsa; } return nullptr; }
RSA* get_private_key() { FILE* private_file = nullptr; if (fopen_s(&private_file, PRI_KEY_FILE, "r") == NULL) { RSA* rsa = PEM_read_RSAPrivateKey(private_file, NULL, NULL, NULL); if (private_file) fclose(private_file); return rsa; } return nullptr; }
BYTE* rsa_encrypt(BYTE* data, RSA* rsa) { int rsa_len = RSA_size(rsa); BYTE* encrypt = (BYTE*)malloc(rsa_len); RSA_public_encrypt(117, data, encrypt, rsa, RSA_PKCS1_PADDING);
return encrypt; }
BYTE* rsa_decrypt(BYTE* data, RSA* rsa) { int rsa_len = RSA_size(rsa); BYTE* decrypt = (BYTE*)malloc(rsa_len); RSA_private_decrypt(rsa_len, data, decrypt, rsa, RSA_PKCS1_PADDING);
return decrypt; }
int main() { generate_rsa_key(); RSA* public_key = get_public_key(); RSA* private_key = get_private_key();
BYTE plaintext[117] = { 0 }; memset(plaintext, 'a', 117);
BYTE* encrypt = rsa_encrypt(plaintext, public_key); BYTE* decrypt = rsa_decrypt(encrypt, private_key);
return 0; }
|