summaryrefslogtreecommitdiffstats
path: root/crypt
diff options
context:
space:
mode:
Diffstat (limited to 'crypt')
-rw-r--r--crypt/hybridcrypt.cpp38
-rw-r--r--crypt/hybridcrypt.h12
2 files changed, 40 insertions, 10 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");
diff --git a/crypt/hybridcrypt.h b/crypt/hybridcrypt.h
index fd0d515..5ed558a 100644
--- a/crypt/hybridcrypt.h
+++ b/crypt/hybridcrypt.h
@@ -99,7 +99,7 @@ private:
/**
* @brief Verschlüsselt den IV und den Key vom AES mit RSA.
* Und nutzt als Padding RSA_OAEP_PADDING.
- * @param pkey Der EVP_PKEY mit dem Verschlüsselt wird.
+ * @param pkey Der EVP_PKEY mit dem verschlüsselt wird.
* @param data Der AES Key und IV.
* @return Den RSA Verschlüsselten Block.
*/
@@ -108,13 +108,21 @@ private:
/**
* @brief Verschlüsselt den IV und den Key vom AES mit RSA.
* Und nutzt als Padding RSA_OAEP_PADDING.
- * @param pkey Der EVP_PKEY mit dem Verschlüsselt wurde.
+ * @param pkey Der EVP_PKEY mit dem verschlüsselt wurde.
* @param data Der RSA Verschlüsselte Block.
* @return Der Aes Key and IV. (Länge is null, falls OAEP Fehler auftrat.
*/
QByteArray decryptAesData(EVP_PKEY *pkey, QByteArray data);
/**
+ * @brief Schreibt den verschlüsselten RSA Header in den outfileStream.
+ * @param outfileStream Der Stream in den der verschlüsselte Header geschrieben wird.
+ * @param pkey Der EVP_PKEY mit dem verschlüsselt wurde.
+ * @param aesData Der AES Key and IV.
+ */
+ void writeRsaHeader(QDataStream *outfileStream, EVP_PKEY *pkey, QByteArray aesData);
+
+ /**
* @brief Ließt einen Empfängerschlüssel aus einer Datei ein.
* @param keyfileName Der Dateiname aus dem der öffentliche Schlüssel gelsen wird.
* @return Der EVP_PKEY für OpenSSL.