Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Decrypt AES with OpenSSL & Qt 5.5.1 Win32 VS2013
Forum Updated to NodeBB v4.3 + New Features

Decrypt AES with OpenSSL & Qt 5.5.1 Win32 VS2013

Scheduled Pinned Locked Moved Solved General and Desktop
opensslqt 5.5.1windowsvs 2013decrypt
42 Posts 3 Posters 27.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Q Offline
    Q Offline
    qDebug
    wrote on last edited by
    #12

    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!

    1 Reply Last reply
    0
    • Q Offline
      Q Offline
      qDebug
      wrote on last edited by
      #13

      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?

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #14

        Your code doesn't match all the openssl line options. -a -A means that you must first decode your Base64 encoded string.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        Q 1 Reply Last reply
        1
        • SGaistS SGaist

          Your code doesn't match all the openssl line options. -a -A means that you must first decode your Base64 encoded string.

          Q Offline
          Q Offline
          qDebug
          wrote on last edited by qDebug
          #15

          @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".

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #16

            Do you mean that you passed your original string through md5 before encrypting it ?

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • Q Offline
              Q Offline
              qDebug
              wrote on last edited by qDebug
              #17

              The password / key was md5 hashed.

              key = md5(utf8(password));
              

              and the iv are the first 16 bytes from the base64 string.

              Edit: Not the key of course, the iv are the first 16 bytes from the base64 string.

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #18

                Can you show the complete procedure ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                0
                • Q Offline
                  Q Offline
                  qDebug
                  wrote on last edited by
                  #19

                  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!

                  1 Reply Last reply
                  0
                  • Q Offline
                    Q Offline
                    qDebug
                    wrote on last edited by
                    #20

                    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!

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #21

                      Do you mean this example ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • Q Offline
                        Q Offline
                        qDebug
                        wrote on last edited by
                        #22

                        Yes. It is the only one i found so far. But the iv and key are random generated, it does not show how to use an already existing key and iv correctly. I really don't know what i am missing here.

                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #23

                          Just replace the random key and iv by yours.

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • Q Offline
                            Q Offline
                            qDebug
                            wrote on last edited by
                            #24

                            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.

                            1 Reply Last reply
                            0
                            • SGaistS Offline
                              SGaistS Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on last edited by
                              #25

                              I took the example as is, replaced key and iv by

                              QByteArray key("098f6bcd4621d373cade4e832627b4f6");
                              QByteArray iv("d8e8fca2dc0f896fd7cb4cb0031ba249");
                              

                              and it's working fine.

                              Interested in AI ? www.idiap.ch
                              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              0
                              • Q Offline
                                Q Offline
                                qDebug
                                wrote on last edited by qDebug
                                #26

                                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.

                                1 Reply Last reply
                                0
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #27

                                  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.

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  1 Reply Last reply
                                  0
                                  • Q Offline
                                    Q Offline
                                    qDebug
                                    wrote on last edited by
                                    #28

                                    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.

                                    1 Reply Last reply
                                    0
                                    • SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #29

                                      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 ?

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      1 Reply Last reply
                                      0
                                      • Q Offline
                                        Q Offline
                                        qDebug
                                        wrote on last edited by qDebug
                                        #30

                                        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
                                        
                                        1 Reply Last reply
                                        0
                                        • SGaistS Offline
                                          SGaistS Offline
                                          SGaist
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #31

                                          And what iv did you use to encrypt the string ?

                                          Interested in AI ? www.idiap.ch
                                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved