From 319f246e4ef5c5c6dde0bf3733a064d6c88ac188 Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Mon, 21 Sep 2015 22:12:56 +0200 Subject: Schreibe vor den RSA Header die Blockgröße MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crypt/hybridcrypt.cpp | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'crypt/hybridcrypt.cpp') 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"); -- cgit v1.2.3-70-g09d2