-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrsa_algorithm.cpp
127 lines (102 loc) · 3.57 KB
/
rsa_algorithm.cpp
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
127
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <iostream>
#include "utils.hpp"
#include "rsa_algorithm.hpp"
void RSAAlgorithm::RunRSAAlgorithm(int keysize) {
unsigned char *ciphertext = NULL, *plaintext = NULL;
size_t ciphertext_len, plaintext_len;
unsigned char input[] = "This is the message.";
size_t input_len = sizeof(input);
//key generation
EVP_PKEY* rsa_keypair = GenerateRSAKeypair(keysize);
std::cout << "\nPlain text: " << input << "\n";
//encrypt
ciphertext = new unsigned char[EVP_PKEY_size(rsa_keypair)];
EncryptRSA(rsa_keypair, &ciphertext, &ciphertext_len, input, input_len);
std::cout << "Cipher text : ";
PrintCipherText(ciphertext, ciphertext_len);
//decrypt
int size = EVP_PKEY_get_size(rsa_keypair);
plaintext = new unsigned char[size];
DecryptRSA(rsa_keypair, &plaintext, &plaintext_len, ciphertext, ciphertext_len);
std::cout << "Decrypted data: " << plaintext << "\n";
delete[] ciphertext;
delete[] plaintext;
EVP_PKEY_free(rsa_keypair);
}
EVP_PKEY* RSAAlgorithm::GenerateRSAKeypair(int keysize) {
int keysize_in_bits = keysize * 8;
EVP_PKEY* rsa_keypair = NULL;
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
if (ctx == NULL)
{
std::cout << "error in ctx.\n";
return NULL;
}
if (EVP_PKEY_keygen_init(ctx) <= 0)
{
std::cout << "error in init of keygen.\n";
EVP_PKEY_CTX_free(ctx);
return NULL;
}
if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, keysize_in_bits) <= 0)
{
std::cout << "error in setting key param.\n";
EVP_PKEY_CTX_free(ctx);
return NULL;
}
if (EVP_PKEY_keygen(ctx, &rsa_keypair) <= 0)
{
std::cout << "error in generating key.\n";
EVP_PKEY_CTX_free(ctx);
return NULL;
}
EVP_PKEY_CTX_free(ctx);
return rsa_keypair;
}
void RSAAlgorithm::EncryptRSA(EVP_PKEY* key, unsigned char** ciphertext, size_t* ciphertext_len, unsigned char* plaintext, size_t plaintext_len) {
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(key, NULL);
if(!ctx) {
std::cerr << "Failed to create context." << std::endl;
return;
}
//initialize
if(EVP_PKEY_encrypt_init(ctx) <= 0) {
std::cerr << "Failed to initialize EVP_PKEY_CTX." << std::endl;
EVP_PKEY_CTX_free(ctx);
return;
}
//encrypt plain text
if(EVP_PKEY_encrypt(ctx, *ciphertext, ciphertext_len, plaintext, plaintext_len) <= 0) {
std::cerr << "Encryption failed." << std::endl;
EVP_PKEY_CTX_free(ctx);
return;
}
EVP_PKEY_CTX_free(ctx);
}
void RSAAlgorithm::DecryptRSA(EVP_PKEY* key, unsigned char** plaintext, size_t* plaintext_len, unsigned char* ciphertext, size_t ciphertext_len) {
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(key, NULL);
if(!ctx) {
std::cerr << "Failed to create EVP_PKEY_CTX." << std::endl;
return;
}
//initialize context
if(EVP_PKEY_decrypt_init(ctx) <= 0) {
std::cerr << "Failed to initialize EVP_PKEY_CTX." << std::endl;
EVP_PKEY_CTX_free(ctx);
return;
}
// decrypt cipher text
if(EVP_PKEY_decrypt(ctx, NULL, plaintext_len, ciphertext, ciphertext_len) <= 0) {
std::cerr << "Failed to determine buffer length." << std::endl;
EVP_PKEY_CTX_free(ctx);
return;
}
if(EVP_PKEY_decrypt(ctx, *plaintext, plaintext_len, ciphertext, ciphertext_len) <= 0) {
std::cerr << "Decryption failed." << std::endl;
EVP_PKEY_CTX_free(ctx);
return;
}
EVP_PKEY_CTX_free(ctx);
}