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
|
#include "hybridcrypt.h"
HybridCrypt::HybridCrypt()
{
// Initialisiere Nutzerschlüssel mit NULL
userKeypair = NULL;
// Lade die menschenlesbaren Fehlerstrings für LibCrypto
ERR_load_crypto_strings();
// Lade alle Hash- und Verschlüsselungsalgorithmen
OpenSSL_add_all_algorithms();
// Lade Konfigurationsdatei und andere wichtige Initialisierungen
OPENSSL_config(NULL);
// Zeige ob der Zufallszahlengenerator initialisiert wurde
qDebug() << "Zufallszahlengenerator erfolgreich initialisiert: " <<
isCsprngSeeded();
}
HybridCrypt::~HybridCrypt()
{
// Räume Nutzerschlüssel auf
if (userKeypair != NULL)
{
EVP_PKEY_free(userKeypair);
}
// Räume OpenSSL auf
// Entferne alle Hash- und Verschlüsselungsalgorithmen
EVP_cleanup();
// Falls das nächste Ausgelassen wird, könnte ein Speicherleck auftreten,
// wenn die BIO Api verwendet wurde (Base64 transformationen)
CRYPTO_cleanup_all_ex_data();
// Lösche den CSPRNG sicher
RAND_cleanup();
// Entferne Fehlerstrings
ERR_free_strings();
}
void HybridCrypt::encrypt(QString infileName, QString outfileName,
QVector<QString> recipientKeyfileNames)
{
}
void HybridCrypt::decrypt(QString infileName, QString outfileName)
{
}
void HybridCrypt::createKeypair()
{
if (isCsprngSeeded())
{
// Lege Schlüsselkontextvariable an
EVP_PKEY_CTX *ctx = NULL;
// Erzeuge den Schlüsselkontext
if (!(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
{
throwOpenSslException();
}
// Initialisiere den Schlüsselgenerator
if (EVP_PKEY_keygen_init(ctx) <= 0)
{
throwOpenSslException();
}
// Lege den Schlüssel mit 2048 Bit an
if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0)
{
throwOpenSslException();
}
// Erzeuge den Schlüssel
if (EVP_PKEY_keygen(ctx, &userKeypair) <= 0)
{
throwOpenSslException();
}
// Räume den Schlüsselkontext ab
EVP_PKEY_CTX_free(ctx);
}
}
void HybridCrypt::importUserKeypair(QString keyfileName, QString password)
{
}
void HybridCrypt::exportUserKeypair(QString keyfileName, QString password)
{
}
void HybridCrypt::exportPublicUserKey(QString keyfileName)
{
}
bool HybridCrypt::isCsprngSeeded()
{
return RAND_status() == 1;
}
void HybridCrypt::throwOpenSslException()
{
QString errorMsg("OpenSSL Fehler. Fehlermeldung: ");
errorMsg.append(ERR_error_string(ERR_get_error(), NULL));
throw new CryptException(errorMsg.toStdString(), 5);
}
|