diff options
| author | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-21 22:12:56 +0200 |
|---|---|---|
| committer | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-21 22:12:56 +0200 |
| commit | 319f246e4ef5c5c6dde0bf3733a064d6c88ac188 (patch) | |
| tree | 8f68dbefa4688d6b1673bd4f199b946471ed3080 /crypt | |
| parent | f57cfd7285dca6dfd16ceec22332436cee3de9cd (diff) | |
| download | src-319f246e4ef5c5c6dde0bf3733a064d6c88ac188.tar.gz src-319f246e4ef5c5c6dde0bf3733a064d6c88ac188.zip | |
Schreibe vor den RSA Header die Blockgröße
Diffstat (limited to 'crypt')
| -rw-r--r-- | crypt/hybridcrypt.cpp | 38 | ||||
| -rw-r--r-- | crypt/hybridcrypt.h | 12 |
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. |
