void encrypt(unsigned char iv[], unsigned char plain[], unsigned char cipher[]) { unsigned char key[LENGTH]; unsigned char inter[LENGTH]; int i; int position[32]; // get permutation position info getPermutationPosition(position); // derive key deriveKey(iv, key); //Applying RightCircular shift to key rightCircularShift32Bit(key); // xor plain text with derived key for(i = 0; i < LENGTH - 1; i++) inter[i] = plain[i]^key[i]; // apply permutation permutation(inter, cipher, position, 32); // apply left rotation thrice for(i = 0; i < 3; i++) leftCircularShift32Bit(cipher); }
void QSslKeyPrivate::decodePem(const QByteArray &pem, const QByteArray &passPhrase, bool deepClear) { QMap<QByteArray, QByteArray> headers; QByteArray data = derFromPem(pem, &headers); if (headers.value("Proc-Type") == "4,ENCRYPTED") { QList<QByteArray> dekInfo = headers.value("DEK-Info").split(','); if (dekInfo.size() != 2) { clear(deepClear); return; } Cipher cipher; if (dekInfo.first() == "DES-CBC") { cipher = DesCbc; } else if (dekInfo.first() == "DES-EDE3-CBC") { cipher = DesEde3Cbc; } else if (dekInfo.first() == "RC2-CBC") { cipher = Rc2Cbc; } else { clear(deepClear); return; } const QByteArray iv = QByteArray::fromHex(dekInfo.last()); const QByteArray key = deriveKey(cipher, passPhrase, iv); data = decrypt(cipher, data, key, iv); } decodeDer(data, deepClear); }
/** * @brief Tries to open a database. * @param path Path to database. * @param password If empty, the database will be opened unencrypted. * Otherwise we will use toxencryptsave to derive a key and encrypt the database. */ RawDatabase::RawDatabase(const QString &path, const QString& password) : workerThread{new QThread}, path{path}, currentHexKey{deriveKey(password)} { workerThread->setObjectName("qTox Database"); moveToThread(workerThread.get()); workerThread->start(); if (!open(path, currentHexKey)) return; }
QByteArray QSslKeyPrivate::toPem(const QByteArray &passPhrase) const { QByteArray data; QMap<QByteArray, QByteArray> headers; if (type == QSsl::PrivateKey && !passPhrase.isEmpty()) { // ### use a cryptographically secure random number generator QByteArray iv; iv.resize(8); for (int i = 0; i < iv.size(); ++i) iv[i] = (qrand() & 0xff); Cipher cipher = DesEde3Cbc; const QByteArray key = deriveKey(cipher, passPhrase, iv); data = encrypt(cipher, derData, key, iv); headers.insert("Proc-Type", "4,ENCRYPTED"); headers.insert("DEK-Info", "DES-EDE3-CBC," + iv.toHex()); } else { data = derData; } return pemFromDer(data, headers); }