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
QtWS25 Last Chance

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 22.9k 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 26 Mar 2016, 21:14 last edited by
    #8

    Where did you get QCA from ?

    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 27 Mar 2016, 00:40
    0
    • S SGaist
      26 Mar 2016, 21:14

      Where did you get QCA from ?

      Q Offline
      Q Offline
      qDebug
      wrote on 27 Mar 2016, 00:40 last edited by qDebug
      #9

      @SGaist Thank you for asking. I got it from http://delta.affinix.com/qca/ (qca-2.1.0.tar.gz).

      Edit: Did find a newer version @ https://www.freshports.org/devel/qca-qt5/ (qca-2.1.1.tar.xz) and i was able to compile it. At least the debug files did compile. But the big problem is

      if(!QCA::isSupported("aes128"))
      {
           qDebug() << "No AES 128 supported ...";
      }
      if(!QCA::isSupported("aes128-cbc"))
      {
           qDebug() << "No AES 128  CBC supported ...";
      }
      if(!QCA::isSupported("aes128-cbc-pkcs7"))
      {
           qDebug() << "No AES 128 CBS pkcs7 supported ...";
      }
      

      According to the docs http://delta.affinix.com/docs/qca/ my version does not support AES CBC at all so it is worthless to me atm. Did i something wrong here?

      win32: LIBS += -L$$PWD/qca/lib/ -lqca-qt5d
      INCLUDEPATH += $$PWD/qca/include
      DEPENDPATH += $$PWD/qca/include
      

      and

      #include <QtCrypto/QtCrypto>
      

      Thanks!

      1 Reply Last reply
      0
      • 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

                                          17/42

                                          2 Apr 2016, 03:16

                                          • Login

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