跳到內容
  • 版面
  • 最新
  • 標籤
  • 熱門
  • 使用者
  • 群組
  • 搜尋
  • Get Qt Extensions
  • Unsolved
Collapse
品牌標誌
  1. 首頁
  2. Behind the Scenes
  3. Wiki Discussion
  4. New SimpleCrypt page
Forum Updated to NodeBB v4.3 + New Features

New SimpleCrypt page

已排程 已置頂 已鎖定 已移動 Wiki Discussion
98 貼文 26 Posters 96.8k 瀏覽 1 Watching
  • 從舊到新
  • 從新到舊
  • 最多點贊
回覆
  • 在新貼文中回覆
登入後回覆
此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
  • AlicemirrorA 離線
    AlicemirrorA 離線
    Alicemirror
    寫於 最後由 編輯
    #7

    Andre, I was no clear in my thought. The page is clear, as is, with the snippet. I agree that a wiki page with too much code became confusing. What I mean is that integrating your page, with a little more documentation about encryption and a project that can be an example (that use in a precise vode source your class) can be useful.

    Usually what I find in documentation on the net regarding encryption or similar, is too much code or too much teory.

    Enrico Miglino (aka Alicemirror)
    Balearic Dynamics
    Islas Baleares, Ibiza (Spain)
    www.balearicdynamics.com

    1 條回覆 最後回覆
    0
    • S 離線
      S 離線
      saidiahd
      寫於 最後由 編輯
      #8

      thank you Andre , a very good work

      "Learn from yesterday, live for today, hope for tomorrow." - Albert Einstein -

      1 條回覆 最後回覆
      0
      • AlicemirrorA 離線
        AlicemirrorA 離線
        Alicemirror
        寫於 最後由 編輯
        #9

        Sure ! :) It's a great starting point.

        Enrico Miglino (aka Alicemirror)
        Balearic Dynamics
        Islas Baleares, Ibiza (Spain)
        www.balearicdynamics.com

        1 條回覆 最後回覆
        0
        • M 離線
          M 離線
          milot.shala
          寫於 最後由 編輯
          #10

          Nice entry Andre.

          1 條回覆 最後回覆
          0
          • A 離線
            A 離線
            andre
            寫於 最後由 編輯
            #11

            I am currently working on a version 2, with these added features:

            • optional integrity checks using a checksum or a cryptographic hash
            • error reporting
            • slightly higher security due to added random character. That should make it harder to guess the first byte of the key based on the fact that there are only a limited number of characters used normally. Should increase effective key length by an guestimated 3 bits.
            1 條回覆 最後回覆
            0
            • A 離線
              A 離線
              andre
              寫於 最後由 編輯
              #12

              I have just uploaded a modified version that implements the above features.

              1 條回覆 最後回覆
              0
              • AlicemirrorA 離線
                AlicemirrorA 離線
                Alicemirror
                寫於 最後由 編輯
                #13

                I am waiting in the shade... When I start (hope tomorrow) I can get the last version :)

                Enrico Miglino (aka Alicemirror)
                Balearic Dynamics
                Islas Baleares, Ibiza (Spain)
                www.balearicdynamics.com

                1 條回覆 最後回覆
                0
                • G 離線
                  G 離線
                  goetz
                  寫於 最後由 編輯
                  #14

                  If you miss the documentation tools discussion: I've split it out to a "new thread":http://developer.qt.nokia.com/forums/viewthread/4619/

                  http://www.catb.org/~esr/faqs/smart-questions.html

                  1 條回覆 最後回覆
                  0
                  • A 離線
                    A 離線
                    andre
                    寫於 最後由 編輯
                    #15

                    I have added a "separate page":http://developer.qt.nokia.com/wiki/SimpleCrypt_algorithm_details that details the algorithm and the layout of the cypher text. Of course, I also added a link from the main page.

                    1 條回覆 最後回覆
                    0
                    • P 離線
                      P 離線
                      paucoma
                      寫於 最後由 編輯
                      #16

                      Hi Andre,
                      First: Thanks for sharing the code.

                      Second: You've got some typos in the Example usage code.

                      • Name of the Class: SimpleCypt --> SimpleCrypt
                      • crypto.setCompression(SimpleCrypto::CompressionAlways)
                        ** crypto.setCompressionMode(SimpleCrypt::CompressionAlways);
                      • crypto.setIntegrityProtection(SimpleCrypto::ProtectHash);
                        ** crypto.setIntegrityProtectionMode(SimpleCrypt::ProtectionHash);
                      • SimpleCrypt.ErrorNoError --> SimpleCrypt::ErrorNoError

                      Third:
                      The String Encryption and Decryption works fine, but for the binary version I seem to be having some difficulties.

                      my main.cpp
                      @
                      #include "simplecrypt.h"

                      #include <QString>
                      #include <QDebug>
                      #include <QBuffer>
                      #include <QDataStream>

                      int main(){
                      QString txStr = "Hello world!";

                      SimpleCrypt crypto(Q_UINT64_C(0x7F29B208)); //some random number
                      // crypto.setCompressionMode(SimpleCrypt::CompressionAlways);
                      // crypto.setIntegrityProtectionMode(SimpleCrypt::ProtectionHash);
                      QBuffer txB;
                      QDataStream s(&txB);
                      s << txStr;

                      QByteArray cypherBytes = crypto.encryptToByteArray(txB.data());
                      if (crypto.lastError() == SimpleCrypt::ErrorNoError) {
                      qDebug() << cypherBytes;
                      }

                      SimpleCrypt cryptu(Q_UINT64_C(0x7F29B208)); //some random number
                      QByteArray plainBytes = cryptu.decryptToByteArray(cypherBytes);
                      if (!cryptu.lastError() == SimpleCrypt::ErrorNoError) {
                      qDebug() << "decrypt error";
                      return 0;
                      }
                      qDebug() << plainBytes;

                      QString rxStr;
                      QBuffer rxB(&plainBytes);
                      QDataStream rs(&rxB);
                      rs >> rxStr;
                      qDebug() << rxStr;
                      return 0;
                      }
                      @

                      My Output (console):

                      "??Sß+"
                      ""
                      ""

                      What have I missed or using incorrectly?

                      Thanks again for the contribution.

                      1 條回覆 最後回覆
                      0
                      • P 離線
                        P 離線
                        paucoma
                        寫於 最後由 編輯
                        #17

                        So I've played a bit around I've come to the conclusion that I'm using QDataStream incorrectly.

                        My Test Code: main.cpp
                        @
                        #include <QString>
                        #include <QDebug>
                        #include <QBuffer>
                        #include <QDataStream>
                        int main(){
                        QString txStr = "Hello world!";
                        QString rxStr;

                        QBuffer txB;
                        txB.open(QIODevice::ReadWrite);
                        QDataStream s(&txB);
                        qDebug() << txB.size();
                        s << txStr;
                        qDebug() << txB.size();
                        s >> rxStr;
                        qDebug() << rxStr;
                        return 0;
                        }
                        @

                        My Output:
                        0
                        28
                        ""

                        So the buffer is being filled but not correctly being read out.. why not?

                        1 條回覆 最後回覆
                        0
                        • G 離線
                          G 離線
                          giesbert
                          寫於 最後由 編輯
                          #18

                          That's an easy question. Your problem is the stream position:

                          you write to the stream, then start reading after the written bytes :-)

                          try out the following:

                          @
                          #include <QString>
                          #include <QDebug>
                          #include <QBuffer>
                          #include <QDataStream>
                          int main()
                          {
                          QString txStr = "Hello world!";
                          QString rxStr;

                          QBuffer txB;
                          txB.open(QIODevice::WriteOnly);
                          QDataStream s(&txB);
                          qDebug() << txB.size();
                          s << txStr;
                          qDebug() << txB.size();
                          txB.close(); // sets stream position to 0 !!!
                          
                          txB.open(QIODevice::ReadOnly);
                          QDataStream s2(&txB);
                          s2 >> rxStr;
                          qDebug() << rxStr;
                          return 0;
                          

                          }
                          @

                          or use a seek in between

                          @
                          #include <QString>
                          #include <QDebug>
                          #include <QBuffer>
                          #include <QDataStream>
                          int main()
                          {
                          QString txStr = "Hello world!";
                          QString rxStr;

                          QBuffer txB;
                          txB.open(QIODevice::WriteOnly);
                          QDataStream s(&txB);
                          qDebug() << txB.size();
                          s << txStr;
                          qDebug() << txB.size();
                          txB.seek(0); // sets stream position to 0 !!!
                          s >> rxStr;
                          qDebug() << rxStr;
                          return 0;
                          

                          }
                          @

                          I did not compile the code, so it might contain typos

                          Nokia Certified Qt Specialist.
                          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                          1 條回覆 最後回覆
                          0
                          • P 離線
                            P 離線
                            paucoma
                            寫於 最後由 編輯
                            #19

                            Aha, got it all sorted out, thanks

                            I had my suspicions on that, but thought that the "<<" and ">>" operators may use seperate index variables.

                            Andre: it would be great if you could incorporate in the Example usage code the following so it works out of the box.

                            @
                            buffer.open(QIODevice::WriteOnly);
                            buffer.close();
                            buffer.open(QIODevice::ReadOnly);
                            @

                            Because newbies like myself:

                            • copy + paste + compile
                              ** if it works -> adapt to needs
                              ** if it doesn't -> get lost in the simplest things

                            Although I must admit that I am learning loads of things through all these problems I get myself into.

                            Gerolf: Once again thanks for your quick and effective response.

                            1 條回覆 最後回覆
                            0
                            • A 離線
                              A 離線
                              andre
                              寫於 最後由 編輯
                              #20

                              paucoma, thank you for your comments and suggestions. I have changed the wiki page accordingly. I am glad you solved the problem, and that it turned out the class itself was not at fault ;-)

                              I must admit that I wrote the examples directly in the wiki page, and thats when errors like these happen. Sorry about that! I hope the current version is more managable? Note that I was talking about "at the other end", implying that the decryption code was not meant to be used in the same function (and thus, implicitly, with the same buffer).

                              1 條回覆 最後回覆
                              0
                              • P 離線
                                P 離線
                                paucoma
                                寫於 最後由 編輯
                                #21

                                Thanks Andre for making the modifications.

                                I have corrected myself a few other details I found.

                                P.S. I didn't know that I had such a priviledge.

                                1 條回覆 最後回覆
                                0
                                • A 離線
                                  A 離線
                                  andre
                                  寫於 最後由 編輯
                                  #22

                                  Thanks for your effort, I really appreciate it. If you want, you're welcome to update it yourself in the wiki article :-)

                                  1 條回覆 最後回覆
                                  0
                                  • G 離線
                                    G 離線
                                    giesbert
                                    寫於 最後由 編輯
                                    #23

                                    Hi Andre,

                                    one suggestion to the wiki page:
                                    In the section SimpleCrypt in use it would be nice to have a list of the encryp/decrypt functions. You state thete are two times 4, but not the names :-)
                                    this means searching inside the code :-)

                                    The rest sound really god. Thanks for the article.

                                    Nokia Certified Qt Specialist.
                                    Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                                    1 條回覆 最後回覆
                                    0
                                    • A 離線
                                      A 離線
                                      andre
                                      寫於 最後由 編輯
                                      #24

                                      [quote author="Gerolf" date="1300958192"]Hi Andre,

                                      one suggestion to the wiki page:
                                      In the section SimpleCrypt in use it would be nice to have a list of the encryp/decrypt functions. You state thete are two times 4, but not the names :-)
                                      this means searching inside the code :-)

                                      The rest sound really god. Thanks for the article.[/quote]

                                      Fair enough, done. :-)

                                      Thanks for the praise.

                                      1 條回覆 最後回覆
                                      0
                                      • G 離線
                                        G 離線
                                        giesbert
                                        寫於 最後由 編輯
                                        #25

                                        Hi Andre,

                                        I'm currently reading your second article, and found the following "here":http://developer.qt.nokia.com/wiki/SimpleCrypt_algorithm_details#00f4e5788aab6d3546bb433842dbbefc :

                                        bq. The payload data block’s contents are encrypted with a four byte (quint64) key.

                                        quint64 is a 64 bit integer, which means 8 byte.

                                        so also in the snipet page, you say:

                                        @
                                        SimpleCrypt crypto(Q_UINT64_C(0x7F29B208)); //some random number
                                        @

                                        this is just a 32 bit number, not 64 bit.

                                        @
                                        void SimpleCrypt::splitKey()
                                        {
                                        m_keyParts.clear();
                                        m_keyParts.resize(4);
                                        for (int i=0;i<4;i++) {
                                        quint64 part = m_key;
                                        for (int j=i; j>0; j--)
                                        part = part >> 8;
                                        part = part & 0xff;
                                        m_keyParts[i] = static_cast<char>(part);
                                        }
                                        }
                                        @

                                        this also only uses 4 bytes, not 8.

                                        Nokia Certified Qt Specialist.
                                        Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                                        1 條回覆 最後回覆
                                        0
                                        • G 離線
                                          G 離線
                                          giesbert
                                          寫於 最後由 編輯
                                          #26

                                          some additional topics:

                                          in "Decrypted payload":http://developer.qt.nokia.com/wiki/SimpleCrypt_algorithm_details#2d478ba9ee3cf03e338b506b1a0292dc

                                          SH1 and CRC have the same description:

                                          bq. In case the Protection Checksum flag has been set, the layout of the decrypted payload looks like this:

                                          I think this is just a copy paste error.

                                          As I'm through now, no more things :-)
                                          Very good article, interesting to read. Thanks.

                                          Nokia Certified Qt Specialist.
                                          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                                          1 條回覆 最後回覆
                                          0

                                          • 登入

                                          • Login or register to search.
                                          • 第一個貼文
                                            最後的貼文
                                          0
                                          • 版面
                                          • 最新
                                          • 標籤
                                          • 熱門
                                          • 使用者
                                          • 群組
                                          • 搜尋
                                          • Get Qt Extensions
                                          • Unsolved