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

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 23.0k Views
  • 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.
  • S Offline
    S Offline
    SGaist
    Lifetime Qt Champion
    wrote on 27 Mar 2016, 20:51 last edited by
    #10

    CBS ? Don't you mean CBC ? If CBC, then yes it does, just take a look at QCA's code.

    Before calling these function did you initialize QCA ?

    Also, do you have OpenSSL in your PATH environment variable when running the application ?

    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 28 Mar 2016, 00:04 last edited by qDebug
      #11

      Yes, CBC, sorry.

      I did put a QCA::Initializer init; after ui->setupUi(this); And yes, Openssl is in my paths env (C:\OpenSSL-Win32\bin), i can call openssl.exe from command line.

      cmake tells me:

      qca-botan off
      qca-cyrus-sasl off
      qca-gcrypt off
      qca-gnupg on
      qca-logger on
      qca-nss off
      qca-ossl on
      qca-pkcs11 off
      qca-softstore on
      

      Do you know if i need one or more plugins to use AES 128 CBC?

      1 Reply Last reply
      0
      • Q Offline
        Q Offline
        qDebug
        wrote on 29 Mar 2016, 16:10 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 31 Mar 2016, 18:04 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
          • S Offline
            S Offline
            SGaist
            Lifetime Qt Champion
            wrote on 31 Mar 2016, 21:20 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 Apr 2016, 03:58
            1
            • S SGaist
              31 Mar 2016, 21:20

              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 1 Apr 2016, 03:58 last edited by qDebug 4 Jan 2016, 04:05
              #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
              • S Offline
                S Offline
                SGaist
                Lifetime Qt Champion
                wrote on 1 Apr 2016, 20:41 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 2 Apr 2016, 03:16 last edited by qDebug 4 Feb 2016, 14:43
                  #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
                  • S Offline
                    S Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 2 Apr 2016, 20:59 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 3 Apr 2016, 19:14 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 5 Apr 2016, 20:08 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
                        • S Offline
                          S Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on 5 Apr 2016, 20:27 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 5 Apr 2016, 20:32 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
                            • S Offline
                              S Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on 5 Apr 2016, 20:34 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 5 Apr 2016, 20:51 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
                                • S Offline
                                  S Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on 5 Apr 2016, 21:22 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 6 Apr 2016, 05:40 last edited by qDebug 4 Jun 2016, 10:46
                                    #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
                                    • S Offline
                                      S Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on 6 Apr 2016, 20:49 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 6 Apr 2016, 21:22 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
                                        • S Offline
                                          S Offline
                                          SGaist
                                          Lifetime Qt Champion
                                          wrote on 6 Apr 2016, 21:47 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

                                          19/42

                                          3 Apr 2016, 19:14

                                          • Login

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