Decrypt AES with OpenSSL & Qt 5.5.1 Win32 VS2013
-
I've mastered the installation now. After building it with Qt Creator i went to the build directory and executed a nmake install. After editing the include paths i also had to add CONFIG += crypto in my pro file. So far no more AES128 CBC not supported errors. But still no luck in decrypting my string.
QString ciphertext = "PpUr+LMHvaKmf0q6J7Oyzo4jbFO5kfWyXl0d8nD3hyM="; QString key1 = "098f6bcd4621d373cade4e832627b4f6"; QString iv1 = "507055722b4c4d4876614b6d66307136"; QByteArray key; key = key1.toLatin1(); QByteArray iv; iv = iv1.toLatin1(); QCA::SecureArray arg = ciphertext.toLatin1(); QCA::Cipher cipher(QString("aes128"),QCA::Cipher::CBC, QCA::Cipher::NoPadding, QCA::Decode, key, iv); QCA::SecureArray plainText = cipher.update(arg); if(!cipher.ok()) { qDebug() << "update fail"; } plainText = cipher.final(); if(!cipher.ok()) { qDebug() << "final fail"; } qDebug() << "plainText.data(): " << plainText.data();
The decrypted text should be Dr. Test and password is test. The iv are the fist 16 bytes from the ciphertext and the password is a md5 hash from test. Works in openssl command line. I get a qDebug final fail result.
Any ideas about that?
Thanks!
-
I'm doing something wrong and i can't figure out what. Changed to utf8, plain key and iv, vise versa, but somehow i won't get this example decrypted. It does work this way in the openssl command line tool.
So far i did not find any example code that used a custom key and iv, only random generated ones. Also gave QCA::SymmetricKey::SymmetricKey(key) and QCA::InitializationVector::InitializationVector(iv) a chance, did not really help.
Any ideas?
-
Your code doesn't match all the openssl line options.
-a -A
means that you must first decode your Base64 encoded string. -
@SGaist Thanks! I don't know why but i did forget about the base64 decode. After changing from toLatin1 to toUtf8 and decode the base64 string i don't get the final error anymore. But i won't get the expected plain text only
o????:??????a?s?]??Iy?[W6???l??(f?$?I{??^ ????Cï5?
same result if i use
qDebug() << "process: " << QCA::SecureArray(cipher.process(decodedBase64.toUtf8())).data();
Maybe the utf8 conversion is the problem but it won't take a QString. I get the same result if i append the string to a QByteArray. Btw. noting changes if i use QByteArray to decode base64 or QCA::Base64 decoder(QCA::Decode);
At least the final error is gone, that's some progress! ;)
Edit: And i added "md5" as crypto service provider because it was encoded this way. md5 is in the list of providers, so i hope i implemented this correctly.
QCA::Cipher cipher(QString("aes128"), QCA::Cipher::CBC, QCA::Cipher::NoPadding, QCA::Decode, key, iv, "md5");
But cipher.provider()->name(); returns "qca-ossl".
-
Do you mean that you passed your original string through md5 before encrypting it ?
-
Can you show the complete procedure ?
-
Thanks for asking. This is the VB code to encrypt the string:
Dim AES As New RijndaelManaged Dim md5 As New MD5CryptoServiceProvider Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(password)) md5.Clear() AES.Key = key AES.GenerateIV() Dim iv() As Byte = AES.IV Dim ms As New MemoryStream ms.Write(iv, 0, iv.Length) Dim cs As New CryptoStream(ms, AES.CreateEncryptor, CryptoStreamMode.Write) Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(string) cs.Write(data, 0, data.Length) cs.FlushFinalBlock() Dim encoded() As Byte = ms.ToArray() Return (Convert.ToBase64String(encoded)) cs.Close() AES.Clear()
As far as i can tell is the password and the string are utf8 bytes and the password is the md5 hash of it. I did try to pass it through
QCA::SecureArray key = QCA::SecureArray::SecureArray(password);
before and after utf8 and md5. So far no luck.
Thank you!
-
And this is my attempt:
QString MainWindow::decryptString(QString password, QString encodedString) { // final decodec string QString decodedString; // get the iv QByteArray array(encodedString.left(16).toStdString().c_str(), encodedString.left(16).size()); QCA::SecureArray iv = array.toHex(); // decode base64 QCA::Base64 decoder(QCA::Decode); const char* decoded = decoder.decodeString(encodedString).toStdString().c_str(); QCA::SecureArray key = QByteArray(QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Md5).toHex()); QCA::SecureArray arg = decoded; QCA::Cipher cipher(QString("aes128"), QCA::Cipher::CBC, QCA::Cipher::NoPadding, QCA::Decode, key, iv); QCA::SecureArray plainText = cipher.update(arg); if(!cipher.ok()) { qDebug() << "update Fail"; } cipher.final(); if(!cipher.ok()) { qDebug() << "final fail"; } qDebug() << "process: " << QCA::SecureArray(cipher.process(decoded)).data(); decodedString = plainText.data(); qDebug() << "Decoded: " << decodedString; return decodedString; }
I call it like:
qDebug() << "decoded: " << decryptString("test", "PpUr+LMHvaKmf0q6J7Oyzo4jbFO5kfWyXl0d8nD3hyM=");
The only step i masted was getting rid of the final fail, but i don't know if that was really the case. Not sure how, i changed this so often, i don't even know how much time i spend on this. I didn't think it can be that difficult to use it.
So far i still did not fine one single example code using qca with aes128cbc and custom iv and key. Very, very strange.
Any ideas?
Thanks!
-
Do you mean this example ?
-
Just replace the random key and iv by yours.
-
I did. That was my first idea, did not work. Id did check the key and iv output, same as i use with openssl, does work in openssl, does not work in Qt / QCA - at least not the way i do it. I don't know, maybe i miss something in general or just just a tiny mistake, but after days and hours, i can confirm, it won't work for me.
-
I took the example as is, replaced key and iv by
QByteArray key("098f6bcd4621d373cade4e832627b4f6"); QByteArray iv("d8e8fca2dc0f896fd7cb4cb0031ba249");
and it's working fine.
-
If you can tell me why this code
QString decodedString; QCA::Initializer init; QByteArray array(encodedString.left(16).toStdString().c_str(), encodedString.left(16).size()); QCA::SecureArray iv = array.toHex(); QCA::Base64 decoder(QCA::Decode); QCA::SecureArray decoded = decoder.decodeString(encodedString).toStdString().c_str(); QCA::SecureArray key = QByteArray(QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Md5).toHex()); QCA::Cipher cipher(QString("aes128"), QCA::Cipher::CBC, QCA::Cipher::NoPadding, QCA::Decode, key, iv); QCA::SecureArray plainText = cipher.update(decoded); if(!cipher.ok()) { qDebug() << "update Fail"; } plainText = cipher.final(); if(!cipher.ok()) { qDebug() << "final fail"; } qDebug() << "process: " << QCA::SecureArray(cipher.process(decoded)).data(); QString decodedString = plainText.data(); qDebug() << "Decoded: " << decodedString;
is not working, it may help me. If you tell me some code is working for you, it does not. This is btw. taken from the example, i did not change anything beside adding key and iv.
-
The first thing that looks strange is your iv creation. You take 16 bytes of your encoded string and turn it to hexadecimal. Why ?
Also, why all the conversions ? Just use QByteArray.
-
098f6bcd4621d373cade4e832627b4f6 is "test" in md5. all the strings i have to decode are encoded with a different iv, the iv is always the first 16 bytes in hex from the encoded string, d8e8fca2dc0f896fd7cb4cb0031ba249 in this case.
So i have to hash the key "test" and get the iv from the encoded string.
And of course, i did test the key and iv just as QByteArray, before and after you posted the example, but the decoding so far did always fail.
-
That's something that is really not clear. You are telling me that you are using as iv for the decoding a part of the alrey encoded string ? So what did you use as iv for the encoding part ?
-
The iv is taken from the still encrypted and base64 encoded string, first 16 bytes hex. iv 507055722b4c4d4876614b6d66307136 is QByteArray array(encodedString.left(16).toStdString().c_str(), encodedString.left(16).size()); qDebug() << "iv: " << array.toHex();
Proof:
echo PpUr+LMHvaKmf0q6J7Oyzo4jbFO5kfWyXl0d8nD3hyM= | openssl enc -d -a -A -aes-128-cbc -iv 507055722b4c4d4876614b6d66307136 -K 098f6bcd4621d373cade4e832627b4f6 8°&¦=YaÌ?{Äa+Dr. Test
-
And what iv did you use to encrypt the string ?