QT好用的加密解密类:SimpleCrypt

 

Simple encryption with SimpleCrypt

The class presented in this article does not provide strong encryption!

It will protect your data from casual observers, but it will not stand up to dedicated hackers trying to break your secrets. I am not a cryptography expert. Use the code here at your own risk. I am not to be held responsible for any damages that may, directly or indirectly, happen because of your use of this code. Don’t say you were not warned.

Introducing SimpleCrypt

The idea of SimpleCrypt is to provide some basic cryptographic capabilities for simple encryption. Only symmetric encryption is supported (that is: only with the same key for encryption and decryption), and there is no API for streaming data in and out like you often see with more advanced cyphers. If you need stronger cryptography, streaming cyphers or asymmetric keys, take a look atQCA[delta.affinix.com] instead.

The SimpleCrypt class takes a 64 bits key in the form of a quint64. If you use a fixed key build into your program, you can do something like this to initialize your SimpleCrypt object:

SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023)); //some random number

...

You can also use the setKey() method to set a key on the class.

Selecting a suitable key

To get such random numbers, you might usethis service[random.org] and pick four of the 2 byte hexadecimals that you concatenate together as done above. That works better than trying to make up something semi-random yourself. Of course, you can also use other means to get to a quint64 key, such as using some hash of a password and reducing that to 64 bits.

SimpleCrypt in use

Once setup, you can use SimpleCrypt to actually encrypt or decrypt data. For the encrypt functions, both theplaintext that you input as the cyphertext that is being outputted can be either a QString or a QByteArray. The reverse applies to the decrypt functions. That results in four encrypt methods, and four corresponding decrypt methods:

Encryption methods

  • QString encryptToString(const QString& plaintext)
  • QString encryptToString(QByteArray plaintext)
  • QByteArray encryptToByteArray(const QString& plaintext)
  • QByteArray encryptToByteArray(QByteArray plaintext)

Decryption methods

  • QString decryptToString(const QString& plaintext)
  • QString decryptToString(QByteArray plaintext)
  • QByteArray decryptToByteArray(const QString& plaintext)
  • QByteArray decryptToByteArray(QByteArray plaintext)

Use with QStrings

 SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023)); //some random number

 QString testString("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");

 QString result = crypto.encryptToString(testString);

 QString decrypted = crypto.decryptToString(result);

 qDebug() << testString << endl << result << endl << decrypted;

The code above encrypts a QString to a QString, and then decrypts that string again to a new QString.

Use with binary data

If you want to encrypt your own binary data, you might do something like this:


 //setup our objects

 SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023)); //some random number
 crypto.setCompressionMode(SimpleCrypt::CompressionAlways); //always compress the data, see section below
 crypto.setIntegrityProtectionMode(SimpleCrypt::ProtectionHash);  //properly protect the integrity of the data

 QBuffer buffer;
 buffer.open(QIODevice::WriteOnly);
 QDataStream s(&buffer);

 //stream the data into our buffer

 s.setVersion(QDataStream::Qt_4_7);
 s << myString; //stream in a string

 s << myUint16; //stream in an unsigned integer
 s << myImage; //stream in an image

s << someMoreData;

 // ... etc.

 QByteArray myCypherText = crypto.encryptToByteArray(buffer.data());

 if (crypto.lastError() == SimpleCrypt::ErrorNoError) {

  // do something relevant with the cyphertext, such as storing it or sending it over a socket to another machine.

 }

 buffer.close();

Note the use of the data protection feature. I would recommend that you use at least the ProtectionChecksum level of protection (enabled by default) if you work with binary data, as streaming invalid binary data into your program can lead to big problems.

On the other end, you can now do:

 SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023)); //same random number: key should match encryption key

 QByteArray plaintext = crypto.decryptToByteArray(myCypherText);

 if (!crypto.lastError() == SimpleCrypt::ErrorNoError) {

  // check why we have an error, use the error code from crypto.lastError() for that

  return;

 }

 QBuffer buffer(&plaintext);

 buffer.open(QIODevice::ReadOnly);

 QDataStream s(&buffer);

 s.setVersion(QDataStream::Qt_4_7);

 s >> myString; //stream in a string

 s >> myUint16; //stream in an unsigned integer

 s >> myImage; //stream in an image

 s >> someMoreData;

 //etc.


 buffer.close();

The code above might crash if the integrity of the data is not guaranteed, for instance by the use of a wrong password. Using the highest level of protection is probably OK here, as we have quite a big blob of data already, so adding the overhead of adding a 20 byte SHA1 cryptographic hash is justifiable.

Compression

For long strings, it can be beneficial to use compression before encryption. Not only does the length of the string decrease, the input will be a bit more random-looking too, resulting in a harder to break cyphertext (at least, in principle, see the warning at the top of this page.) However, for short strings, applying compression can lead to anincrease in the string length.

SimpleCrypt supports three modes for compression before encryption. You can force to always use compression, to never use compression, or to automatically choose the shortest version (either the compressed one or the uncompressed one). The last option is the default option. Note that setting this only affectsencryption. For decryption, SimpleCrypt automatically decompresses the data if compression was used for the encryption.

The code

simplecrypt.h


/*


Copyright (c) 2011, Andre Somers
All rights reserved.
Redistribution and use in source and binary forms, with or without

modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright

      notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright

      notice, this list of conditions and the following disclaimer in the

      documentation and/or other materials provided with the distribution.

    * Neither the name of the Rathenau Instituut, Andre Somers nor the

      names of its contributors may be used to endorse or promote products

      derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND

ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED

WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

DISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY

DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/


#ifndef SIMPLECRYPT_H

#define SIMPLECRYPT_H

#include <QString>

#include <QVector>

#include <QFlags>


/**
  @short Simple encryption and decryption of strings and byte arrays

  This class provides a simple implementation of encryption and decryption

  of strings and byte arrays.

  @warning The encryption provided by this class is NOT strong encryption. It may

  help to shield things from curious eyes, but it will NOT stand up to someone

  determined to break the encryption. Don't say you were not warned.

  The class uses a 64 bit key. Simply create an instance of the class, set the key,

  and use the encryptToString() method to calculate an encrypted version of the input string.

  To decrypt that string again, use an instance of SimpleCrypt initialized with

  the same key, and call the decryptToString() method with the encrypted string. If the key

  matches, the decrypted version of the string will be returned again.

  If you do not provide a key, or if something else is wrong, the encryption and

  decryption function will return an empty string or will return a string containing nonsense.
  lastError() will return a value indicating if the method was succesful, and if not, why not.

  SimpleCrypt is prepared for the case that the encryption and decryption

  algorithm is changed in a later version, by prepending a version identifier to the cypertext.

  */

class SimpleCrypt

{

public:

    /**

      CompressionMode describes if compression will be applied to the data to be

      encrypted.

      */

    enum CompressionMode {

        CompressionAuto,    /*!< Only apply compression if that results in a shorter plaintext. */

        CompressionAlways,  /*!< Always apply compression. Note that for short inputs, a compression may result in longer data */

        CompressionNever    /*!< Never apply compression. */

  };

    /**

      IntegrityProtectionMode describes measures taken to make it possible to detect problems with the data

      or wrong decryption keys.

      Measures involve adding a checksum or a cryptograhpic hash to the data to be encrypted. This

      increases the length of the resulting cypertext, but makes it possible to check if the plaintext

      appears to be valid after decryption.

    */

    enum IntegrityProtectionMode {

        ProtectionNone,    /*!< The integerity of the encrypted data is not protected. It is not really possible to detect a wrong key, for instance. */

        ProtectionChecksum,/*!< A simple checksum is used to verify that the data is in order. If not, an empty string is returned. */

        ProtectionHash     /*!< A cryptographic hash is used to verify the integrity of the data. This method produces a much stronger, but longer check */

    };

    /**

      Error describes the type of error that occured.

      */


    enum Error {

        ErrorNoError,         /*!< No error occurred. */

        ErrorNoKeySet,        /*!< No key was set. You can not encrypt or decrypt without a valid key. */

        ErrorUnknownVersion,  /*!< The version of this data is unknown, or the data is otherwise not valid. */

        ErrorIntegrityFailed, /*!< The integrity check of the data failed. Perhaps the wrong key was used. */

    };



    /**

      Constructor.

      Constructs a SimpleCrypt instance without a valid key set on it.

     */


    SimpleCrypt();

    /**

      Constructor.

      Constructs a SimpleCrypt instance and initializes it with the given @arg key.

     */

    explicit SimpleCrypt(quint64 key);

    /**

      (Re-) initializes the key with the given @arg key.

      */

    void setKey(quint64 key);

    /**

      Returns true if SimpleCrypt has been initialized with a key.

      */

    bool hasKey() const {return !m_keyParts.isEmpty();}

    /**

      Sets the compression mode to use when encrypting data. The default mode is Auto.

      Note that decryption is not influenced by this mode, as the decryption recognizes

      what mode was used when encrypting.

      */

    void setCompressionMode(CompressionMode mode) {m_compressionMode = mode;}

    /**

      Returns the CompressionMode that is currently in use.

      */

    CompressionMode compressionMode() const {return m_compressionMode;}
    /**

      Sets the integrity mode to use when encrypting data. The default mode is Checksum.

      Note that decryption is not influenced by this mode, as the decryption recognizes

      what mode was used when encrypting.

      */

    void setIntegrityProtectionMode(IntegrityProtectionMode mode) {m_protectionMode = mode;}

    /**

      Returns the IntegrityProtectionMode that is currently in use.

      */

    IntegrityProtectionMode integrityProtectionMode() const {return m_protectionMode;}

    /**

      Returns the last error that occurred.

      */

    Error lastError() const {return m_lastError;}

    /**

      Encrypts the @arg plaintext string with the key the class was initialized with, and returns

      a cyphertext the result. The result is a base64 encoded version of the binary array that is the

      actual result of the string, so it can be stored easily in a text format.

      */

   QString encryptToString(constQString& plaintext) ;

    /**

      Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns

      a cyphertext the result. The result is a base64 encoded version of the binary array that is the

      actual result of the encryption, so it can be stored easily in a text format.

      */

   QString encryptToString(QByteArray plaintext) ;

    /**

      Encrypts the @arg plaintext string with the key the class was initialized with, and returns

      a binary cyphertext in a QByteArray the result.

      This method returns a byte array, that is useable for storing a binary format. If you need

      a string you can store in a text file, use encryptToString() instead.

      */

   QByteArray encryptToByteArray(constQString& plaintext) ;

    /**

      Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns

      a binary cyphertext in a QByteArray the result.
      This method returns a byte array, that is useable for storing a binary format. If you need

      a string you can store in a text file, use encryptToString() instead.

      */

   QByteArray encryptToByteArray(QByteArray plaintext) ;

    /**

      Decrypts a cyphertext string encrypted with this class with the set key back to the

      plain text version.

      If an error occured, such as non-matching keys between encryption and decryption,

      an empty string or a string containing nonsense may be returned.

      */    

   QString decryptToString(constQString& cyphertext) ;

    /**

      Decrypts a cyphertext string encrypted with this class with the set key back to the

      plain text version.

      If an error occured, such as non-matching keys between encryption and decryption,

      an empty string or a string containing nonsense may be returned.

      */

   QByteArray decryptToByteArray(constQString& cyphertext) ;


    /**

      Decrypts a cyphertext binary encrypted with this class with the set key back to the

      plain text version.

      If an error occured, such as non-matching keys between encryption and decryption,

      an empty string or a string containing nonsense may be returned.

      */

   QString decryptToString(QByteArray cypher) ;

    /**

      Decrypts a cyphertext binary encrypted with this class with the set key back to the

      plain text version.

      If an error occured, such as non-matching keys between encryption and decryption,

      an empty string or a string containing nonsense may be returned.

      */

   QByteArray decryptToByteArray(QByteArray cypher) ;

    //enum to describe options that have been used for the encryption. Currently only one, but

    //that only leaves room for future extensions like adding a cryptographic hash...

    enum CryptoFlag{CryptoFlagNone = 0,

                    CryptoFlagCompression = 0x01,

                    CryptoFlagChecksum = 0x02,

                    CryptoFlagHash = 0x04

                   };

    Q_DECLARE_FLAGS(CryptoFlags, CryptoFlag);

private:

    void splitKey();

    quint64 m_key;
    QVector<char> m_keyParts;

    CompressionMode m_compressionMode;

    IntegrityProtectionMode m_protectionMode;

    Error m_lastError;

};

Q_DECLARE_OPERATORS_FOR_FLAGS(SimpleCrypt::CryptoFlags)

#endif // SimpleCrypt_H

 

simplecrypt.cpp
/*

Copyright (c) 2011, Andre Somers

All rights reserved.

Redistribution and use in source and binary forms, with or without

modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright

      notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright

      notice, this list of conditions and the following disclaimer in the

      documentation and/or other materials provided with the distribution.

    * Neither the name of the Rathenau Instituut, Andre Somers nor the

      names of its contributors may be used to endorse or promote products

      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND

ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED

WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

DISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY

DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/

#include "simplecrypt.h"

#include <QByteArray>

#include <QtDebug>

#include <QtGlobal>

#include <QDateTime>

#include <QCryptographicHash>

SimpleCrypt::SimpleCrypt():

    m_key(0),

    m_compressionMode(CompressionAuto),

    m_protectionMode(ProtectionChecksum),

    m_lastError(ErrorNoError)

{

    qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));

}

SimpleCrypt::SimpleCrypt(quint64 key):

    m_key(key),

    m_compressionMode(CompressionAuto),

    m_protectionMode(ProtectionChecksum),

    m_lastError(ErrorNoError)

{

    qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));

    splitKey();

}


void SimpleCrypt::setKey(quint64 key)

{

    m_key = key;

    splitKey();

}


void SimpleCrypt::splitKey()

{

    m_keyParts.clear();

    m_keyParts.resize(8);

    for (int i=0;i<8;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);

    }

}



QByteArray SimpleCrypt::encryptToByteArray(constQString& plaintext)

{

   QByteArray plaintextArray = plaintext.toUtf8();

    return encryptToByteArray(plaintextArray);

}


QByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext)

{

    if (m_keyParts.isEmpty()) {

        qWarning() << "No key set.";

        m_lastError = ErrorNoKeySet;

        returnQByteArray();

    }

   QByteArray ba = plaintext;

    CryptoFlags flags = CryptoFlagNone;

    if (m_compressionMode == CompressionAlways) {

        ba = qCompress(ba, 9); //maximum compression

        flags |= CryptoFlagCompression;

    } else if (m_compressionMode == CompressionAuto) {

       QByteArray compressed = qCompress(ba, 9);


        if (compressed.count() < ba.count()) {

            ba = compressed;

            flags |= CryptoFlagCompression;

        }

    }


    QByteArray integrityProtection;

    if (m_protectionMode == ProtectionChecksum) {

        flags |= CryptoFlagChecksum;

       QDataStream s(&integrityProtection,QIODevice::WriteOnly);

        s << qChecksum(ba.constData(), ba.length());

    } else if (m_protectionMode == ProtectionHash) {

        flags |= CryptoFlagHash;

       QCryptographicHash hash(QCryptographicHash::Sha1);

        hash.addData(ba);

        integrityProtection += hash.result();

    }


    //prepend a random char to the string

    char randomChar = char(qrand() & 0xFF);

    ba = randomChar + integrityProtection + ba;

    int pos(0);

    char lastChar(0);

    int cnt = ba.count();

    while (pos < cnt) {

        ba[pos] = ba.at(pos) ^ m_keyParts.at(pos % 8) ^ lastChar;

        lastChar = ba.at(pos);

        ++pos;

    }

   QByteArray resultArray;

    resultArray.append(char(0x03));  //version for future updates to algorithm

    resultArray.append(char(flags)); //encryption flags

    resultArray.append(ba);

    m_lastError = ErrorNoError;

    return resultArray;

}


QString SimpleCrypt::encryptToString(constQString& plaintext)

{

   QByteArray plaintextArray = plaintext.toUtf8();

   QByteArray cypher = encryptToByteArray(plaintextArray);

   QString cypherString =QString::fromAscii(cypher.toBase64());

    return cypherString;

}



QString SimpleCrypt::encryptToString(QByteArray plaintext)

{

   QByteArray cypher = encryptToByteArray(plaintext);

   QString cypherString =QString::fromAscii(cypher.toBase64());

    return cypherString;

}


QString SimpleCrypt::decryptToString(constQString &cyphertext)

{

   QByteArray cyphertextArray =QByteArray::fromBase64(cyphertext.toAscii());

   QByteArray plaintextArray = decryptToByteArray(cyphertextArray);

   QString plaintext =QString::fromUtf8(plaintextArray, plaintextArray.size());

    return plaintext;

}



QString SimpleCrypt::decryptToString(QByteArray cypher)

{

   QByteArray ba = decryptToByteArray(cypher);

   QString plaintext =QString::fromUtf8(ba, ba.size());

    return plaintext;

}



QByteArray SimpleCrypt::decryptToByteArray(constQString& cyphertext)

{

   QByteArray cyphertextArray =QByteArray::fromBase64(cyphertext.toAscii());

   QByteArray ba = decryptToByteArray(cyphertextArray);

    return ba;

}


QByteArray SimpleCrypt::decryptToByteArray(QByteArray cypher)

{

    if (m_keyParts.isEmpty()) {

        qWarning() << "No key set.";

        m_lastError = ErrorNoKeySet;

        returnQByteArray();

    }

   QByteArray ba = cypher;

    if( cypher.count() < 3 )

        returnQByteArray();

    char version = ba.at(0);

    if (version !=3) {  //we only work with version 3

        m_lastError = ErrorUnknownVersion;

        qWarning() << "Invalid version or not a cyphertext.";

        returnQByteArray();

    }


    CryptoFlags flags = CryptoFlags(ba.at(1));

    ba = ba.mid(2);

    int pos(0);

    int cnt(ba.count());

    char lastChar = 0;

    while (pos < cnt) {

        char currentChar = ba[pos];

        ba[pos] = ba.at(pos) ^ lastChar ^ m_keyParts.at(pos % 8);

        lastChar = currentChar;

        ++pos;

    }


    ba = ba.mid(1); //chop off the random number at the start

    bool integrityOk(true);

    if (flags.testFlag(CryptoFlagChecksum)) {

        if (ba.length() < 2) {

            m_lastError = ErrorIntegrityFailed;

            returnQByteArray();

        }

        quint16 storedChecksum;

        {

           QDataStream s(&ba,QIODevice::ReadOnly);

            s >> storedChecksum;

        }

        ba = ba.mid(2);

        quint16 checksum = qChecksum(ba.constData(), ba.length());

        integrityOk = (checksum == storedChecksum);

    } else if (flags.testFlag(CryptoFlagHash)) {

        if (ba.length() < 20) {

            m_lastError = ErrorIntegrityFailed;

            returnQByteArray();

        }

       QByteArray storedHash = ba.left(20);

        ba = ba.mid(20);

       QCryptographicHash hash(QCryptographicHash::Sha1);

        hash.addData(ba);

        integrityOk = (hash.result() == storedHash);

    }

    if (!integrityOk) {

        m_lastError = ErrorIntegrityFailed;

        returnQByteArray();

    }


    if (flags.testFlag(CryptoFlagCompression))
        ba = qUncompress(ba);


    m_lastError = ErrorNoError;
    return ba;


}

You can copy/paste the code above into your own simplecrypt.h and simplecrypt.cpp files to use it.

Details on the algorithm

The algorithm and data format used in this class, have been detailed on aseparate page. On that page, you can find byte-for-byte descriptions of how the cypher text is constructed from the plain text.

Future extensions

I, or somebody else, may choose to extend SimpleCrypt in the future, or fix a weakness of some kind. To make that possible without loosing the option to read your older encrypted data, the generated cyphertext contains a version number. The idea is that future versions of this code will have a higher version number, but will keep supporting the decryption of cyphertexts with a lower version number. The current version number is 2. Note that these version numbers need not coincide with code version numbers, as a change in the code does not always result in a change in the actual encryption.

 


 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一种流行的跨平台应用程序开发框架,提供了各种功能丰富的库和工具,包括AES加密和解密算法的支持。 AES(Advanced Encryption Standard)是一种对称加密算法,被广泛应用于保护数据的机密性和安全性。在Qt中,我们可以使用QCryptographic库来实现AES加密和解密操作。 首先,我们需要在项目中包含QCryptographic库的头文件: #include <QCryptographicHash> 然后,使用该库中的相关方法来进行加密和解密操作。例如,使用AES-128加密算法: QString plaintext = "Hello, World!"; QString password = "SecretPassword"; // 将明文转换为字节数组 QByteArray plaintextBytes = plaintext.toUtf8(); // 创建AES加密对象 QAESEncryption aesEncrypt(QAESEncryption::AES_128, QAESEncryption::CBC); // 设置加密密码 aesEncrypt.setKey(password.toUtf8()); // 加密明文数据 QByteArray encryptedData = aesEncrypt.encode(plaintextBytes); // 将加密数据转换为十六进制字符串 QString encryptedText = encryptedData.toHex(); // 输出加密后的结果 qDebug() << "Encrypted text: " << encryptedText; 上述代码将明文字符串"Hello, World!"使用AES-128算法加密,加密密码为"SecretPassword",然后将加密后的数据转换为十六进制字符串并输出。 解密操作可以使用相同的加密密码和加密算法: // 将加密后的字符串转换为字节数组 QByteArray encryptedData = QByteArray::fromHex(encryptedText.toUtf8()); // 创建AES解密对象 QAESEncryption aesDecrypt(QAESEncryption::AES_128, QAESEncryption::CBC); // 设置解密密码 aesDecrypt.setKey(password.toUtf8()); // 解密数据 QByteArray decryptedData = aesDecrypt.decode(encryptedData); // 将解密后的字节数组转换为明文字符串 QString decryptedText = QString::fromUtf8(decryptedData); // 输出解密结果 qDebug() << "Decrypted text: " << decryptedText; 上述代码将加密后的十六进制字符串转换为字节数组,然后使用AES-128算法和密码"SecretPassword"进行解密操作,最后将解密后的字节数组转换为明文字符串并输出。 通过以上代码片段,我们可以在Qt中使用AES算法进行加密和解密操作,保护我们的数据的机密性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值