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 ++++++++++++++++++++++++++++++-------- crypt/hybridcrypt.h | 12 ++++++++++-- 2 files changed, 40 insertions(+), 10 deletions(-) (limited to 'crypt') 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,12 +108,20 @@ 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. -- cgit v1.2.3-70-g09d2