Реальная история.
Я был на самом деле также работаю над этим с помощью SSL SEAL в:
#включают <строка>
#включают <исключение>
используя зЬй :: строку;
// ЬурейеЙ структура RSA;
#включают
Класс чтение: общественный станд :: исключение
{
общественности:
виртуальный Const символ *, что () Const бросок ();
};
Класс NoKeypairLoaded: общественный станд :: исключение
{
общественности:
виртуальный Const символ *, что () Const бросок ();
};
класс AccessCard
{
общественности:
Карта доступа();
~ AccessCard ();
аннулируются Сформировать ();
аннулируются нагрузки (Const строки& PEM, Const строка& проходить);
недействительным PublicKey (строка& PEM) Const;
недействительным PrivateKey (строка& PEM, Const строка& ключевая фраза) сопзЬ;
Печать недействительным (FILE * in_file, FILE * out_file);
аннулированию Unseal (FILE * in_file, FILE * out_file);
частный:
аннулированию CheckKey () сопзЬ;
RSA * пара ключей;
};
класс Биобокс
{
общественности:
структура буфера
{
пустота * ЬиЕ;
INT размер;
};
Биобокс ();
~ Биобокс ();
недействительным ConstructSink (Const строка& ул);
аннулированию NewBuffer ();
БИО * Био () Const;
Буфер ReadAll ();
частный:
BIO * био;
Буфер ЬиЕ;
};
класс EvpBox
{
общественности:
EvpBox (RSA * Кейп);
~ EvpBox ();
EVP_PKEY * Key ();
частный:
EVP_PKEY * evpkey;
};
// --------------------
#включают
Const символ * :: Ошибка чтения, что () Const бросок ()
{
вернуть "Проблема чтения BIO.";
}
Const символ * NoKeypairLoaded ::, что () Const бросок ()
{
вернуть "Нет пару ключей не загружены.";
}
AccessCard :: AccessCard ()
: Пара ключей (NULL)
{
если (EVP_get_cipherbyname ("AES-256-CBC") == NULL)
OpenSSL_add_all_algorithms ();
}
AccessCard :: ~ AccessCard ()
{
RSA_free (пара ключей);
}
аннулируются AccessCard :: CheckKey () Const
{
если (! пара ключей)
бросить NoKeypairLoaded ();
}
недействительный AccessCard :: Сформировать ()
{
RSA_free (пара ключей);
= RSA_generate_key пара ключей (2048, RSA_F4, NULL, NULL);
Проверить ключ();
}
статический символ * LoseStringConst (Const строка& ул)
{
вернуться const_cast<символ *>(Str.c_str ());
}
статическая сила * StringAsVoid (Const строка& ул)
{
вернуться reinterpret_cast<недействительным *>(LoseStringConst (ул));
}
Биобокс :: Биобокс ()
: Био (NULL)
{
buf.buf = NULL;
buf.size = 0;
}
Биобокс :: ~ Биобокс ()
{
BIO_free (био);
бесплатно (buf.buf);
}
аннулируется Биобокс :: ConstructSink (Const строки& ул)
{
BIO_free (био);
био = BIO_new_mem_buf (StringAsVoid (ул), -1);
если (! био)
бросить Ошибка чтения ();
}
аннулируются Биобокс :: NewBuffer ()
{
BIO_free (био);
био = BIO_new (BIO_s_mem ());
если (! био)
бросить Ошибка чтения ();
}
BIO * Биобокс :: Bio () Const
{
вернуться био;
}
Биобокс :: Buffer Биобокс :: ReadAll ()
{
buf.size = BIO_ctrl_pending (био);
buf.buf = таНос (buf.size);
если (BIO_read (био, buf.buf, buf.size) < 0) {
// если (ERR_peek_error ()) {
// ERR_reason_error_string (ERR_get_error ());
// возвращает NULL;
//}
бросить Ошибка чтения ();
}
вернуться БУФ;
}
EvpBox :: EvpBox (RSA * Кейп)
{
evpkey = EVP_PKEY_new ();
если (! EVP_PKEY_set1_RSA (evpkey, Кейп)) {
бросить Ошибка чтения ();
}
}
EvpBox :: ~ EvpBox ()
{
EVP_PKEY_free (evpkey);
}
EVP_PKEY * EvpBox :: Key ()
{
вернуться evpkey;
}
Статическая INT pass_cb (символ * ЬиЕ, внутр размер, внутр rwflag, пустота * и)
{
Const строка пас = reinterpret_cast<символ *>(И);
INT Len = pass.size ();
// если слишком долго, усечение
если (LEN > размер)
Len = размер;
pass.copy (BUF, длина);
вернуться Len;
}
аннулируется AccessCard :: Load (Const строки& PEM, Const строка& проходить)
{
RSA_free (пара ключей);
Биобокс био;
bio.ConstructSink (PEM);
= PEM_read_bio_RSAPrivateKey пара ключей (bio.Bio (), NULL, pass_cb,
StringAsVoid (проход));
Проверить ключ();
}
аннулируются AccessCard :: PublicKey (строка& PEM) сопзЬ
{
Проверить ключ();
Биобокс био;
bio.NewBuffer ();
INT RET = PEM_write_bio_RSA_PUBKEY (bio.Bio (), пара ключей);
если (! RET)
бросить Ошибка чтения ();
Const Биобокс :: Buffer& ЬиЕ = bio.ReadAll ();
PEM = строка (reinterpret_cast(Buf.buf), buf.size);
}
аннулируются AccessCard :: PrivateKey (строка& PEM, Const строка& ключевая фраза) сопзЬ
{
Проверить ключ();
Биобокс био;
bio.NewBuffer ();
EvpBox ЦПС (пара ключей);
INT RET = PEM_write_bio_PKCS8PrivateKey (bio.Bio (), evp.Key (),
EVP_aes_256_cbc (),
LoseStringConst (ключевая фраза),
passphrase.size (), NULL, NULL);
если (! RET)
бросить Ошибка чтения ();
Const Биобокс :: Buffer& ЬиЕ = bio.ReadAll ();
PEM = строка (reinterpret_cast(Buf.buf), buf.size);
}
#включают
#включают
#включают
#включают
#включают
#включают
#включают <арпа / inet.h> / * Для Htonl () * /
аннулируются AccessCard :: Печать (FILE * in_file, FILE * out_file)
{
Проверить ключ();
// Смотри ниже
}
аннулируются AccessCard :: Unseal (FILE * in_file, FILE * out_file)
{
Проверить ключ();
}
// ------------------------------------------------ -------------------
// это обыкновение быть в конечном файле ... это наш блок тест
// ------------------------------------------------ -------------------
#включают
#включают
используя зЬй :: COUT;
Int основных ()
{
AccessCard согл;
// Новый ключ
acc.Generate ();
строка PEM;
//acc.PublicKey(pem);
// соиЬ << PEM << "\ п";
acc.PrivateKey (PEM, "Здравствуйте");
// соиЬ << PEM << "\ п";
//// ----------------
acc.Load (PEM, "Здравствуйте");
acc.PublicKey (PEM);
// соиЬ << PEM << "\ п";
//acc.Seal(stdin, стандартный вывод);
возвращать 0;
}
#включают
#включают
#включают
#включают
#включают
#включают
#включают
#включают <арпа / inet.h> / * Для Htonl () * /
// ключ RSA должен быть 2048 бит с показателем 65537
символ * PUBLIC_KEY_PEM =
"----- НАЧАТЬ PUBLIC KEY ----- \ п"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwu4ymKmuXoSvZn + TLOIh \ п"
"SXq7w + P1OeM9LCDt7ZpR / krdMyW6UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHB \ п"
"Im / tvzhomZgMGtL0Ln + Lbh7UkdWqlBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1Lq \ п"
"ctSVf3EQhAHajyI3V + 6JFDcdjzRPX9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFy \ п"
"ч / EeK7GiDcOrx + 7hRZ6yfeD71xpK4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjg \ п"
"gs7ps2D / 8SKmUcsWRldbxm3 + yKJPwUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8 \ п"
"GwIDAQAB \ п"
"----- END PUBLIC KEY ----- \ п";
символ * PRIVATE_KEY_PEM =
"----- НАЧАТЬ зашифрованное Частное КЛЮЧА ----- \ п"
"MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIa4XBjpJFZtQCAggA \ п"
"MB0GCWCGSAFlAwQBKgQQ / dTrBC83CJnHfwgM6rotAwSCBNCvGXvzLgNkWT3Kvwui \ п"
"Ln7gfiGtOfaubw5oq8DVh51hMhyYKnS8wAjMEkB0heFwTLLy1PCZnGv916NcUWhu \ п"
"b4OxwCb / F3viBRSRgNaq5GB / c1HNeeg8CtEHs / EkxdIJuJuNr / giQp // TZ7Gm6Xf \ п"
"Zb2rrdbW8ivxnactmJHdy5aRWA6Bhf5qr + 0MjrTrUWKORUUIRLzJzGJ481Y0WIA6 \ п"
"9iK7I6aQnr5KzTETTUcMj + цу + WvlW3Ly3kn5ZGds / yB0wHnLTvCOBnIv9mq2nmZ3 \ п"
"Pyfm + WJirMwXkcZF + 7U3Hsbk3Uk6VJqR / G0gKSiBebCgypYe6w5JTJQAoWdy96Zc \ п"
"QHwr47dXIuhMzusdx9D67xz2HR0InGTnSTUOxCfYFDQaWdVUh2lHDswWqi6ZlFLJ \ п"
"POkh24yaxE2S7Yn / CKAnET961GLAvVXChecjF2XkOoOGxE2rmOkrpc6fjndVTz5J \ п"
"B4Vj0d3jotuHG + a6kbksV + 71JbpJr5F69VRjsWpiEOwunHmtTdGhOmBkcyqJHXBh \ п"
"8kusMSbZUzJTPFuTMJmxxzExasmif2CbJBl4WyfvKQjKlXyJSkysJN2V2NrA5Vpc \ п"
"eb9msgXX8vBaN40ahT5mDeG5TXDPdssYOnQTM4vJo6IkSS2DIbMcUgbTcj9Qf3WZ \ п"
"Y + FPROyIu8aKmCqDnDqJFp7aYaqjw5BWm6gL9YroPvNB8Funs8O1IgksMIUC + MT8 \ п"
"kFmq / Z9eUeoRawg4MGcMrgTdPDlrDB7uWfY2tPG / kkHQWEQyv13jJ1uEjUKf6wYk \ п"
"WmIY5tvPEX3y4smscdWZGDQEjWL7zLs + 7oLOwru2TbYmCx + V2QJpIW6Ppql / HCYr \ п"
"+ FJ + 3qZ + I + eVcAW52jY8ygesab / + bQOrgpEfmBpTglTd + tt6h + 16INagI4W + cY0z \ п"
"iRcQjerjsgHM6JP4o4ZgxHBryHr5HdaZtpNXf3sHnaSwDCM / kVaeHAg + ciduRg + О \ п"
"S6TIfdk334IFg7wXHRjjZXDX1QzRpUSBWvG4IdgE5Z9 / 3B0tvDbcU + R6c4GCTsiH \ п"
"GZ / BWBQKaS3HhxhaUIlZhXXVgFvmGP5DsdaDQZG2VAsZqsTISrEG8OnHaklZIqi6 \ п"
"/ GcMHJ2bHGmBKMgj0cTtkE53h1UZzlDkYqnf8b50uYunvDTNne / LPsPbfeuxTxDL \ п"
"Oe5LtSD36vhSaExmaOkSN0qTY83zTDvxbSe7GBf87TNRimfnXZtxpghpgDffXgVi \ п"
"j5JUcDjXpSC4xeu8jbq / lzh6x4o4nJRloPye8Zmq5VP7heZRN07GHDY6r1Jzz / 4с \ п"
"mBJWfMEg / OqB8CrOJibi6IPN3VkKzcF2WSWG712RizNHkWwaamlesC0dluXDmudj \ п"
"bKr1niEF7KinUYiDu7ZJAntMRSm0hzjilAabSBXYP1RFOsZfgUfltON0oC2Zj5iX \ п"
"wPaBUYhx2Fwn9jsge4NBWn3OXnqzZaq1Ojl0qb3YRbi2FVkisyZV / Dqzj1uGYkRq \ п"
"6n6yoPqfAk / + u69Hzp1hHQi2wYbHbIDuQEI / kKRZ / XBxoL6c9LvYyKXKgBqd8RVU \ п"
"Т + AmBDkjEtksjQYaicwxe3MEcrM1PcEDyxJwRDsWp8Lo8wOU30A6ESlZb2TH / GGV \ п"
"OxKP46YqccVN57 + pU8RZ6bi0jg == \ п"
"----- END ENCRYPTED PRIVATE KEY ----- \ п";
символ * PRIVATE_KEY_PEM_TWO =
"----- НАЧАТЬ RSA PRIVATE KEY ----- \ п"
"MIIEowIBAAKCAQEAwu4ymKmuXoSvZn + TLOIhSXq7w + P1OeM9LCDt7ZpR / krdMyW6 \ п"
"UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHBIm / tvzhomZgMGtL0Ln + Lbh7UkdWq \ п"
"lBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1LqctSVf3EQhAHajyI3V + 6JFDcdjzRP \ п"
"X9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFyh / EeK7GiDcOrx + 7hRZ6yfeD71xpK \ п"
"4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjggs7ps2D / 8SKmUcsWRldbxm3 + yKJP \ п"
"wUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8GwIDAQABAoIBACNlFRLbXKoU9bRq \ п"
"3dJ8jQbGnmmHbvO / 60 + J + W / 1wYWnGls7MoW07tEkDIVK3MFVsT6GWoflXERy24mS \ п"
"b2FarHMQV98s4vFgxnHodCYtSqgIORjx7zNLu8C4geg3Jg8lHZnVCtKoIVwo + dqv \ п"
"q0ViLOgE6dBmO1V88K6ky9 / PlFxzBA7ER / XLqbkdmgDC + XLGQ63s31FXeKla9rQg \ п"
"XodPx9AYUYuTLXOlNT1KXCa9a53qgB2woTGdtc1fPkBpnd + SHd2MItR + 35X2ZXnY \ п"
"b3kzOj + 62O5MmC + sNysNy5D6Aut1fsEzauJr4jGP8TtpvC4Qc3 / vLt2l7g / WHAzp \ п"
"0TPiMGECgYEA9fHMBVIkTUzpKnzoF3jhqNFoqJqXgul32e7ej8Ov5b06wId1WLA / \ п"
"/ ZmgucPLAL1DDVyJMotNqeQPWt3x9 ++ nTpnDHavGQ96y7SEI2zHuLMuhoR9c1zfA \ п"
"MQicGfk25dhXWtMxFilFAkBbwCcLEq1XHcMI6ek4zKYlJ8tCHC4BmtcCgYEAyuZ0 \ п"
"91CBLcBuBrwpnxdXtOurwRDoOgXpJxy8bD9ctltcPFeilBUWuLYZ + gyBozli23Uh \ п"
"KuDlKMZJw + CHztiEJwuzzzWOOxejs2qtBfSHM7Hne37Qpb / qcVfgn5C6fj7LeIgG \ п"
"hUdK2QN2jEx + AWahFFFJ6Z2cmQBXXBGOW4LGZF0CgYA9 + / ukV6hohvq4x5Qi3kdZ \ п"
"KbXL0HJg / wBCv639457AMunMvhb4DCuEeaSFTPArtodgpbK6N1uSdrTb / NXP2 + l5 \ п"
"qM0A / FrSnhzQIKQ / why503RfzCy03QsmEHpvHV0VnmmdrV5QrIQE5j15dx2WTnOH \ п"
"P7FOaoXzJeh1WAfIXFvxLwKBgQC2XvIfIVMa5m1 + zD2062xAB9w3CpVRIeLw7tlF \ п"
"iqYwmmmLK1HMPDBSEgvDPt5 + 8aOzkdIgEkinn6LJ1tT6zI3r8o7J3l9bKeJP78BZ \ п"
"К / MiOfPQgqnTcW6uNciGY7Xcp2CHk + wYe34BFSXG8TII3FBITNBclPgeZbof3P / Р \ п"
"rPfZWQKBgEbk1OsuDxUbcfgeMT0f1cBiJxtkRsj3Kffm6c2PAzGZg8A / EgoR25Cr \ п"
"v + u4s5aS / 3cBAfJhu9OAqoXdYJlXfYsoKuyOyvzeyOcsAsKjd6tIiU6xUe / u65oZ \ п"
"1KXWzXoYgnNW3eoU7YeQ0Ca4SSg3qG2jqGFIAClla + hyLUeEgXB1 \ п"
"----- END RSA PRIVATE KEY ----- \ п";
Статическая INT pass_cb (символ * ЬиЕ, внутр размер, внутр rwflag, пустота * и)
{
Int LEN = STRLEN ("Здравствуйте");
// если слишком долго, усечение
если (LEN > размер)
Len = размер;
strncpy (ЬиЕ, "Здравствуйте", Длина);
вернуться Len;
}
INT do_evp_seal (FILE * in_file, FILE * out_file)
{
INT RetVal = 0;
RSA * rsa_pkey = NULL;
EVP_PKEY * PKey = EVP_PKEY_new ();
EVP_CIPHER_CTX CTX;
неподписанный символ буфер [4096];
символ без знака buffer_out [4096 + EVP_MAX_IV_LENGTH];
size_t Len;
INT len_out;
неподписанные символ * ки;
Int eklen;
uint32_t eklen_n;
символ без знака IV [EVP_MAX_IV_LENGTH];
OpenSSL_add_all_algorithms ();
БИО * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PRIVATE_KEY_PEM), -1);
// BIO * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PUBLIC_KEY_PEM), -1);
// если (! PEM_read_bio_RSA_PUBKEY (PBIO, &rsa_pkey, NULL, NULL))
если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, pass_cb, NULL))
// если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, NULL, NULL))
{
fprintf (STDERR, "Ошибка при загрузке RSA Public Key File. \ п");
ERR_print_errors_fp (STDERR);
RetVal = 2;
Гото вне;
}
если (! EVP_PKEY_assign_RSA (PKey, rsa_pkey))
{
fprintf (STDERR, "EVP_PKEY_assign_RSA: не удалось \ п.");
RetVal = 3;
Гото вне;
}
EVP_CIPHER_CTX_init (&CTX);
ек = reinterpret_cast<неподписанные символ *>(ТаНос (EVP_PKEY_size (PKey)));
если (! EVP_SealInit (&CTX, EVP_aes_256_cbc (), &ек, &eklen, внутривенно, &PKey, 1))
{
fprintf (STDERR, "EVP_SealInit:. Не удалось \ п");
RetVal = 3;
Гото out_free;
}
/ * Сначала выпишем зашифрованную длину ключа, то зашифрованный ключ,
* То IV (длина IV фиксируется шифром мы выбрали).
* /
eklen_n = Htonl (eklen);
если (FWRITE (&eklen_n, SizeOf eklen_n, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
если (FWRITE (ек, eklen, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
если (FWRITE (IV, EVP_CIPHER_iv_length (EVP_aes_256_cbc ()), 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
/ * Теперь мы обрабатываем входной файл и записывать зашифрованные данные к
* выходной файл. * /
в то время как ((Len = Fread (буфер, 1, SizeOf буфера, in_file)) > 0)
{
если (! EVP_SealUpdate (&CTX, buffer_out, &len_out, буфер, длина))
{
fprintf (STDERR, "EVP_SealUpdate: не удалось \ п.");
RetVal = 3;
Гото out_free;
}
если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
}
если (FERROR (in_file))
{
PError ("входной файл");
RetVal = 4;
Гото out_free;
}
если (! EVP_SealFinal (&CTX, buffer_out, &len_out))
{
fprintf (STDERR, "EVP_SealFinal: не удалось \ п.");
RetVal = 3;
Гото out_free;
}
если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
out_free:
EVP_PKEY_free (PKey);
бесплатно (ек);
вне:
вернуться RetVal;
}
Int основных ()
{
вернуть do_evp_seal (STDIN, STDOUT);
}
#включают
#включают
#включают
#включают
#включают
#включают
#включают <арпа / inet.h>
символ * PUBLIC_KEY_PEM =
"----- НАЧАТЬ PUBLIC KEY ----- \ п"
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvdbGZes3N / v3EqbbwYHW4rr4W \ п"
"gav9eD36kVD7Hn5LIKwhfAqd1 + LSN2YC49IsIhzwbXqoMUN89UZmFEdY4 / M4qW1 + \ п"
"qwOfaX80EKCl8zV5Ztp8fvoErS1Z / G0k0c0kRdP0BCZTI9nSfjZkhbqWKnJrtCgi \ п"
"s6OXXTeanU9B9Bz3HQIDAQAB \ п"
"----- END PUBLIC KEY ----- \ п";
символ * PRIVATE_KEY_PEM =
"----- НАЧАТЬ зашифрованное Частное КЛЮЧА ----- \ п"
"MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIa4XBjpJFZtQCAggA \ п"
"MB0GCWCGSAFlAwQBKgQQ / dTrBC83CJnHfwgM6rotAwSCBNCvGXvzLgNkWT3Kvwui \ п"
"Ln7gfiGtOfaubw5oq8DVh51hMhyYKnS8wAjMEkB0heFwTLLy1PCZnGv916NcUWhu \ п"
"b4OxwCb / F3viBRSRgNaq5GB / c1HNeeg8CtEHs / EkxdIJuJuNr / giQp // TZ7Gm6Xf \ п"
"Zb2rrdbW8ivxnactmJHdy5aRWA6Bhf5qr + 0MjrTrUWKORUUIRLzJzGJ481Y0WIA6 \ п"
"9iK7I6aQnr5KzTETTUcMj + цу + WvlW3Ly3kn5ZGds / yB0wHnLTvCOBnIv9mq2nmZ3 \ п"
"Pyfm + WJirMwXkcZF + 7U3Hsbk3Uk6VJqR / G0gKSiBebCgypYe6w5JTJQAoWdy96Zc \ п"
"QHwr47dXIuhMzusdx9D67xz2HR0InGTnSTUOxCfYFDQaWdVUh2lHDswWqi6ZlFLJ \ п"
"POkh24yaxE2S7Yn / CKAnET961GLAvVXChecjF2XkOoOGxE2rmOkrpc6fjndVTz5J \ п"
"B4Vj0d3jotuHG + a6kbksV + 71JbpJr5F69VRjsWpiEOwunHmtTdGhOmBkcyqJHXBh \ п"
"8kusMSbZUzJTPFuTMJmxxzExasmif2CbJBl4WyfvKQjKlXyJSkysJN2V2NrA5Vpc \ п"
"eb9msgXX8vBaN40ahT5mDeG5TXDPdssYOnQTM4vJo6IkSS2DIbMcUgbTcj9Qf3WZ \ п"
"Y + FPROyIu8aKmCqDnDqJFp7aYaqjw5BWm6gL9YroPvNB8Funs8O1IgksMIUC + MT8 \ п"
"kFmq / Z9eUeoRawg4MGcMrgTdPDlrDB7uWfY2tPG / kkHQWEQyv13jJ1uEjUKf6wYk \ п"
"WmIY5tvPEX3y4smscdWZGDQEjWL7zLs + 7oLOwru2TbYmCx + V2QJpIW6Ppql / HCYr \ п"
"+ FJ + 3qZ + I + eVcAW52jY8ygesab / + bQOrgpEfmBpTglTd + tt6h + 16INagI4W + cY0z \ п"
"iRcQjerjsgHM6JP4o4ZgxHBryHr5HdaZtpNXf3sHnaSwDCM / kVaeHAg + ciduRg + О \ п"
"S6TIfdk334IFg7wXHRjjZXDX1QzRpUSBWvG4IdgE5Z9 / 3B0tvDbcU + R6c4GCTsiH \ п"
"GZ / BWBQKaS3HhxhaUIlZhXXVgFvmGP5DsdaDQZG2VAsZqsTISrEG8OnHaklZIqi6 \ п"
"/ GcMHJ2bHGmBKMgj0cTtkE53h1UZzlDkYqnf8b50uYunvDTNne / LPsPbfeuxTxDL \ п"
"Oe5LtSD36vhSaExmaOkSN0qTY83zTDvxbSe7GBf87TNRimfnXZtxpghpgDffXgVi \ п"
"j5JUcDjXpSC4xeu8jbq / lzh6x4o4nJRloPye8Zmq5VP7heZRN07GHDY6r1Jzz / 4с \ п"
"mBJWfMEg / OqB8CrOJibi6IPN3VkKzcF2WSWG712RizNHkWwaamlesC0dluXDmudj \ п"
"bKr1niEF7KinUYiDu7ZJAntMRSm0hzjilAabSBXYP1RFOsZfgUfltON0oC2Zj5iX \ п"
"wPaBUYhx2Fwn9jsge4NBWn3OXnqzZaq1Ojl0qb3YRbi2FVkisyZV / Dqzj1uGYkRq \ п"
"6n6yoPqfAk / + u69Hzp1hHQi2wYbHbIDuQEI / kKRZ / XBxoL6c9LvYyKXKgBqd8RVU \ п"
"Т + AmBDkjEtksjQYaicwxe3MEcrM1PcEDyxJwRDsWp8Lo8wOU30A6ESlZb2TH / GGV \ п"
"OxKP46YqccVN57 + pU8RZ6bi0jg == \ п"
"----- END ENCRYPTED PRIVATE KEY ----- \ п";
символ * PRIVATE_KEY_PEM_TWO =
"----- НАЧАТЬ RSA PRIVATE KEY ----- \ п"
"MIIEowIBAAKCAQEAwu4ymKmuXoSvZn + TLOIhSXq7w + P1OeM9LCDt7ZpR / krdMyW6 \ п"
"UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHBIm / tvzhomZgMGtL0Ln + Lbh7UkdWq \ п"
"lBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1LqctSVf3EQhAHajyI3V + 6JFDcdjzRP \ п"
"X9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFyh / EeK7GiDcOrx + 7hRZ6yfeD71xpK \ п"
"4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjggs7ps2D / 8SKmUcsWRldbxm3 + yKJP \ п"
"wUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8GwIDAQABAoIBACNlFRLbXKoU9bRq \ п"
"3dJ8jQbGnmmHbvO / 60 + J + W / 1wYWnGls7MoW07tEkDIVK3MFVsT6GWoflXERy24mS \ п"
"b2FarHMQV98s4vFgxnHodCYtSqgIORjx7zNLu8C4geg3Jg8lHZnVCtKoIVwo + dqv \ п"
"q0ViLOgE6dBmO1V88K6ky9 / PlFxzBA7ER / XLqbkdmgDC + XLGQ63s31FXeKla9rQg \ п"
"XodPx9AYUYuTLXOlNT1KXCa9a53qgB2woTGdtc1fPkBpnd + SHd2MItR + 35X2ZXnY \ п"
"b3kzOj + 62O5MmC + sNysNy5D6Aut1fsEzauJr4jGP8TtpvC4Qc3 / vLt2l7g / WHAzp \ п"
"0TPiMGECgYEA9fHMBVIkTUzpKnzoF3jhqNFoqJqXgul32e7ej8Ov5b06wId1WLA / \ п"
"/ ZmgucPLAL1DDVyJMotNqeQPWt3x9 ++ nTpnDHavGQ96y7SEI2zHuLMuhoR9c1zfA \ п"
"MQicGfk25dhXWtMxFilFAkBbwCcLEq1XHcMI6ek4zKYlJ8tCHC4BmtcCgYEAyuZ0 \ п"
"91CBLcBuBrwpnxdXtOurwRDoOgXpJxy8bD9ctltcPFeilBUWuLYZ + gyBozli23Uh \ п"
"KuDlKMZJw + CHztiEJwuzzzWOOxejs2qtBfSHM7Hne37Qpb / qcVfgn5C6fj7LeIgG \ п"
"hUdK2QN2jEx + AWahFFFJ6Z2cmQBXXBGOW4LGZF0CgYA9 + / ukV6hohvq4x5Qi3kdZ \ п"
"KbXL0HJg / wBCv639457AMunMvhb4DCuEeaSFTPArtodgpbK6N1uSdrTb / NXP2 + l5 \ п"
"qM0A / FrSnhzQIKQ / why503RfzCy03QsmEHpvHV0VnmmdrV5QrIQE5j15dx2WTnOH \ п"
"P7FOaoXzJeh1WAfIXFvxLwKBgQC2XvIfIVMa5m1 + zD2062xAB9w3CpVRIeLw7tlF \ п"
"iqYwmmmLK1HMPDBSEgvDPt5 + 8aOzkdIgEkinn6LJ1tT6zI3r8o7J3l9bKeJP78BZ \ п"
"К / MiOfPQgqnTcW6uNciGY7Xcp2CHk + wYe34BFSXG8TII3FBITNBclPgeZbof3P / Р \ п"
"rPfZWQKBgEbk1OsuDxUbcfgeMT0f1cBiJxtkRsj3Kffm6c2PAzGZg8A / EgoR25Cr \ п"
"v + u4s5aS / 3cBAfJhu9OAqoXdYJlXfYsoKuyOyvzeyOcsAsKjd6tIiU6xUe / u65oZ \ п"
"1KXWzXoYgnNW3eoU7YeQ0Ca4SSg3qG2jqGFIAClla + hyLUeEgXB1 \ п"
"----- END RSA PRIVATE KEY ----- \ п";
INT do_evp_seal (FILE * in_file, FILE * out_file)
{
INT RetVal = 0;
RSA * rsa_pkey = NULL;
EVP_PKEY * PKey = EVP_PKEY_new ();
EVP_CIPHER_CTX CTX;
неподписанный символ буфер [4096];
символ без знака buffer_out [4096 + EVP_MAX_IV_LENGTH];
size_t Len;
INT len_out;
неподписанные символ * ки;
Int eklen;
uint32_t eklen_n;
символ без знака IV [EVP_MAX_IV_LENGTH];
OpenSSL_add_all_algorithms ();
БИО * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PRIVATE_KEY_PEM), -1);
если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, NULL, NULL))
{
fprintf (STDERR, "Ошибка при загрузке RSA Public Key File. \ п");
ERR_print_errors_fp (STDERR);
RetVal = 2;
Гото вне;
}
если (! EVP_PKEY_assign_RSA (PKey, rsa_pkey))
{
fprintf (STDERR, "EVP_PKEY_assign_RSA: не удалось \ п.");
RetVal = 3;
Гото вне;
}
/ * Сначала выпишем зашифрованную длину ключа, то зашифрованный ключ,
* То IV (длина IV фиксируется шифром мы выбрали).
* /
если (Fread (&eklen_n, SizeOf eklen_n, 1, in_file)! = 1)
{
PError ("входной файл");
RetVal = 5;
Гото out_free;
}
eklen = ntohl (eklen_n);
// eklen = 128;
// ек = reinterpret_cast<неподписанные символ *>(ТаНос (EVP_PKEY_size (PKey)));
// ек = reinterpret_cast<неподписанные символ *>(ТаНос (eklen));
ек = новый символ без знака [eklen];
если (Fread (ек, eklen, 1, in_file)! = 1)
{
PError ("входной файл");
RetVal = 5;
Гото out_free;
}
если (Fread (IV, EVP_CIPHER_iv_length (EVP_aes_256_cbc ()), 1, in_file)! = 1)
{
PError ("входной файл");
RetVal = 5;
Гото out_free;
}
EVP_CIPHER_CTX_init (&CTX);
если (! EVP_OpenInit (&CTX, EVP_aes_256_cbc (), ек, eklen, внутривенно, PKey))
{
fprintf (STDERR, "EVP_OpenInit:. Не удалось \ п");
RetVal = 3;
Гото out_free;
}
Е ("% D \ п", Eklen);
/ * Теперь мы обрабатываем входной файл и записывать зашифрованные данные к
* выходной файл. * /
в то время как ((Len = Fread (буфер, 1, SizeOf буфера, in_file)) > 0)
{
если (! EVP_OpenUpdate (&CTX, buffer_out, &len_out, буфер, длина))
{
fprintf (STDERR, "EVP_OpenUpdate: не удалось \ п.");
RetVal = 3;
Гото out_free;
}
если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
}
если (FERROR (in_file))
{
PError ("входной файл");
RetVal = 4;
Гото out_free;
}
если (! EVP_OpenFinal (&CTX, buffer_out, &len_out))
{
fprintf (STDERR, "EVP_OpenFinal: не удалось \ п.");
RetVal = 3;
Гото out_free;
}
если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
{
PError ("выходной файл");
RetVal = 5;
Гото out_free;
}
out_free:
EVP_PKEY_free (PKey);
бесплатно (ек);
вне:
вернуться RetVal;
}
ИНТ основной (интермедиат ARGC, символ * ARGV [])
{
вернуть do_evp_seal (STDIN, STDOUT);
}
Не уверен, что если код полезен сейчас, но в любом случае демпинг его ...
г ++ a.cpp -lssl -o enctest
./ enctest
г ++ b.cpp -lssl -o уплотнение
./печать < ВХОД > ENCOUT
г ++ c.cpp -lssl -o распечатывания
./ распечатывания < ENCOUT