summaryrefslogtreecommitdiffstats
path: root/crypt/hybridcrypt.cpp
diff options
context:
space:
mode:
authorStefan Suhren <suhren.stefan@fh-swf.de>2015-09-21 22:12:56 +0200
committerStefan Suhren <suhren.stefan@fh-swf.de>2015-09-21 22:12:56 +0200
commit319f246e4ef5c5c6dde0bf3733a064d6c88ac188 (patch)
tree8f68dbefa4688d6b1673bd4f199b946471ed3080 /crypt/hybridcrypt.cpp
parentf57cfd7285dca6dfd16ceec22332436cee3de9cd (diff)
downloadsrc-319f246e4ef5c5c6dde0bf3733a064d6c88ac188.tar.gz
src-319f246e4ef5c5c6dde0bf3733a064d6c88ac188.zip
Schreibe vor den RSA Header die Blockgröße
Diffstat (limited to 'crypt/hybridcrypt.cpp')
-rw-r--r--crypt/hybridcrypt.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp
index 05e9995..c5646d0 100644
--- a/crypt/hybridcrypt.cpp
+++ b/crypt/hybridcrypt.cpp
@@ -83,15 +83,13 @@ void HybridCrypt::encrypt(QString infileName, QString outfileName,
outfileStream << (qint32) keyCount;
EVP_PKEY *tmpKey;
- QByteArray tmpData;
for (int i = 0; i < recipientKeyfileNames.length(); i++)
{
tmpKey = readRecipientKey(recipientKeyfileNames[i]);
// Schreibe den Header in die Datei
- tmpData = encryptAesData(tmpKey, aesKey + aesIv);
- outfileStream.writeRawData(tmpData.data(), tmpData.length());
+ writeRsaHeader(&outfileStream, tmpKey, aesKey + aesIv);
// Räume Schlüssel auf
freeEvpKey(&tmpKey);
@@ -100,8 +98,7 @@ void HybridCrypt::encrypt(QString infileName, QString outfileName,
// Damit der Nutzer selbst die Datei auch entschlüsseln kann, falls er einen Schlüssel hat
if (userKeypair != NULL)
{
- tmpData = encryptAesData(userKeypair, aesKey + aesIv);
- outfileStream.writeRawData(tmpData.data(), tmpData.length());
+ writeRsaHeader(&outfileStream, userKeypair, aesKey + aesIv);
}
// Erzeuge den symmetrischen Kontext
@@ -187,6 +184,7 @@ void HybridCrypt::decrypt(QString infileName, QString outfileName)
// Lese die Anzahl der Schlüssel aus der Datei
infileStream >> keyCount;
+ qint32 tmpDataLength = 0;
QByteArray tmpData;
QByteArray aesKey(EVP_CIPHER_key_length(EVP_aes_256_cbc()), 0);
QByteArray aesIv(EVP_CIPHER_iv_length(EVP_aes_256_cbc()), 0);
@@ -194,9 +192,22 @@ void HybridCrypt::decrypt(QString infileName, QString outfileName)
// Versuche alle Header zu entschlüsseln
for (qint32 i = 0; i < keyCount && tmpData.length() == 0; i++)
{
- tmpData.resize(256);
+ infileStream >> tmpDataLength;
+ tmpData.resize(tmpDataLength);
infileStream.readRawData(tmpData.data(), tmpData.length());
- tmpData = decryptAesData(userKeypair, tmpData);
+
+ // Versuche nur den RSA Block zu entschlüsseln,
+ // wenn die Modulogröße des Nutzerschlüssels auf die
+ // des zum Verschlüsseln genutzten Schlüssels passt.
+ if (tmpDataLength == RSA_size(userKeypair->pkey.rsa))
+ {
+ tmpData = decryptAesData(userKeypair, tmpData);
+ }
+ else
+ {
+ // Um in die nächste Entschlüsselungsrunde zu kommen
+ tmpData.resize(0);
+ }
}
// Wenn kein Header entschlüsselt werden konnte, wirf eine Excption
@@ -206,7 +217,7 @@ void HybridCrypt::decrypt(QString infileName, QString outfileName)
CryptException::DecryptionErrorRsa);
}
- // Ließ die Aes Daten aus
+ // Ließ die AES Daten aus
aesKey = tmpData.left(aesKey.length());
aesIv = tmpData.mid(aesKey.length(), aesIv.length());
@@ -571,6 +582,17 @@ QByteArray HybridCrypt::decryptAesData(EVP_PKEY *pkey, QByteArray data)
return out;
}
+void HybridCrypt::writeRsaHeader(QDataStream *outfileStream, EVP_PKEY *pkey, QByteArray aesData)
+{
+ QByteArray data = encryptAesData(pkey, aesData);
+
+ if (data.length() > 0)
+ {
+ *outfileStream << (qint32) data.length();
+ outfileStream->writeRawData(data.data(), data.length());
+ }
+}
+
EVP_PKEY *HybridCrypt::readRecipientKey(QString keyfileName)
{
FILE *tmpKeyfile = fopen(keyfileName.toStdString().c_str(), "r");