Kód: Vybrat vše
/**
* \file ukol4-sifrovani.cpp
* Code for encrypting a file.
* \author Miroslav Vlach <vlachmir@fit.cvut.cz> */
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <openssl/evp.h>
#include <openssl/pem.h>
#define bufferInLen 1024
#define bufferOutLen 1024 + EVP_MAX_IV_LENGTH
using namespace std;
int main(int argc, char* argv[])
{
FILE *fp, *in, *out;
if (argc != 3) {
cout << "Chybne zadani, potreba zadat jmeno_souboru_k_zasifrovani jmeno_souboru_verejneho_klice" << endl;
return 1;
}
if (!(fp = fopen(argv[2], "rb"))) {
cout << "Cannot open public key file" << endl;
return 1;
}
if (!(in = fopen(argv[1], "rb"))) {
cout << "Cannot open data file" << endl;
return 1;
}
if (!(out = fopen("encrypted", "wb"))) {
cout << "Cannot open output file" << endl;
return 1;
}
EVP_PKEY * pubkey;
pubkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
int bytesRead = 1;
char bufferIn[bufferInLen];
char bufferOut[bufferOutLen];
int tmpLen = 0, stLen = 0;
unsigned char *ek = new unsigned char[EVP_PKEY_size(pubkey)];
unsigned char *iv = new unsigned char[EVP_MAX_IV_LENGTH];
for (int i = 0; i < EVP_MAX_IV_LENGTH; i++)
iv[i] = '\0';
int ekLen, ivMaxLen = EVP_MAX_IV_LENGTH;
EVP_CIPHER_CTX ctx;
/* 1 = EVP_aes_128_cbc
* 2 = EVP_aes_128_ecb
* 3 = EVP_aes_192_cbc
* 4 = EVP_aes_192_ecb
*/
int cipherTypeF = 3;
if (!EVP_SealInit(&ctx, EVP_aes_192_cbc(), &ek, &ekLen, iv, &pubkey, 1)) {
cout << "SealInit failed" << endl;
return 1;
}
fwrite(&cipherTypeF, 1, sizeof(cipherTypeF), out);
fwrite(&ekLen, 1, sizeof(ekLen), out); // enc. key len.
fwrite(ek, 1, ekLen, out); // enc. key
fwrite(&ivMaxLen, sizeof(ivMaxLen), 1, out); // delka iv
fwrite(iv, ivMaxLen, 1, out); // iv
while (bytesRead > 0) {
bytesRead = fread(bufferIn, 1, bufferInLen, in);
EVP_SealUpdate(&ctx, (unsigned char*)bufferOut, &tmpLen, (const unsigned char*)bufferIn, bytesRead);
stLen += tmpLen;
fwrite(bufferOut, 1, tmpLen, out);
}
EVP_SealFinal(&ctx, (unsigned char*)bufferOut , &tmpLen);
stLen += tmpLen;
fwrite(bufferOut, 1, tmpLen, out);
delete[] ek;
delete[] iv;
fclose(out);
fclose(in);
EVP_PKEY_free(pubkey);
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
Kód: Vybrat vše
/**
* \file ukol4-desifrovani.cpp
* Code for decrypting a file.
* \author Miroslav Vlach <vlachmir@fit.cvut.cz> */
#include <stdio.h>
#include <string>
#include <iostream>
#include <openssl/evp.h>
#include <openssl/pem.h>
#define bufferInLen 1024
#define bufferOutLen 1024 + EVP_MAX_IV_LENGTH
using namespace std;
int main(int argc, char* argv[])
{
FILE *fp, *in, *out;
if (argc != 3) {
cout << "Chybne zadani, potreba zadat jmeno_souboru_k_desifrovani jmeno_souboru_privatniho_klice" << endl;
return 1;
}
if (!(fp = fopen(argv[2], "rb"))) {
cout << "Cannot open private key file" << endl;
return 1;
}
if (!(in = fopen(argv[1], "rb"))) {
cout << "Cannot open data file" << endl;
return 1;
}
if (!(out = fopen("decrypted", "wb"))) {
cout << "Cannot open output file" << endl;
return 1;
}
EVP_PKEY * privkey;
privkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
int bytesRead = 1;
char bufferIn[bufferInLen];
char bufferOut[bufferOutLen];
int tmpLen = 0, otLen = 0;
unsigned char *ek = new unsigned char[EVP_PKEY_size(privkey)];
unsigned char *iv = new unsigned char[EVP_MAX_IV_LENGTH];
int ekLen, ivLen;
int cipherTypeF;
const EVP_CIPHER* cipherType;
EVP_CIPHER_CTX ctx;
fread(&cipherTypeF, 1, sizeof(cipherTypeF), in);
switch (cipherTypeF) {
case 1:
cipherType = EVP_aes_128_cbc();
break;
case 2:
cipherType = EVP_aes_128_ecb();
break;
case 3:
cipherType = EVP_aes_192_cbc();
break;
case 4:
cipherType = EVP_aes_192_ecb();
break;
default:
cout << "Cipher not found" << endl;
return 1;
}
bytesRead = fread(&ekLen, 1, sizeof(ekLen), in); // en. key len.
bytesRead = fread(ek, 1, ekLen, in); // enc. key
bytesRead = fread(&ivLen, sizeof(ivLen), 1, in); // delka iv
bytesRead = fread(iv, ivLen, 1, in); // iv
if (!EVP_OpenInit(&ctx, cipherType, ek, ekLen, iv, privkey)) {
cout << "OpenInit failed" << endl;
return 1;
}
while (bytesRead > 0) {
bytesRead = fread(bufferIn, 1, bufferInLen, in);
EVP_OpenUpdate(&ctx, (unsigned char*)bufferOut, &tmpLen,
(const unsigned char*)bufferIn, bytesRead);
otLen += tmpLen;
fwrite(bufferOut, 1, tmpLen, out);
}
EVP_OpenFinal(&ctx, (unsigned char*)bufferOut, &tmpLen);
otLen += tmpLen;
fwrite(bufferOut, 1, tmpLen, out);
delete[] ek;
delete[] iv;
fclose(out);
fclose(in);
EVP_PKEY_free(privkey);
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}