README.md

    Qt-AES

    Small and portable AES encryption class for Qt. Native support for all key sizes - 128/192/256 bits - ECB, CBC, CFB and OFB modes for all key sizes partial AES-NI support

    Usage

    Available Methods

    // Encode of rawText with key
    // iv is used in CBC mode
    // return the encrypted byte array
    QByteArray encode(const QByteArray rawText, const QByteArray key, const QByteArray iv = QByteArray());
    
    // Decode of rawText with key
    // iv is used in CBC mode
    // return the decrypted byte array
    QByteArray decode(const QByteArray rawText, const QByteArray key, const QByteArray iv = QByteArray());
    
    // Key expansion in Rijndael schedule
    // return the new expanded key as byte array
    QByteArray expandKey(const QByteArray key);

    The same methods are available as static calls

    QAESEncryption::Crypt => encode(...)
    QAESEncryption::Decrypt => decode(...)
    QAESEncryption::ExpandKey => expandKey(...)

    AES Levels

    The class supports all AES key lenghts

    • AES_128
    • AES_192
    • AES_256

    Modes

    The class supports the following operating modes

    • ECB
    • CBC
    • CFB
    • OFB

    Padding

    By default the padding method is ISO, however, the class supports:

    • ZERO
    • PKCS7
    • ISO

    Example

    Sample code using a 128bit key in ECB mode

    #include "qaesencryption.h"
    
    QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::ECB);
    QByteArray encodedText = encryption.encode(plainText, key);
    
    QByteArray decodedText = encryption.decode(encodedText, key);

    Example for 256bit CBC using QString

    #include <QCryptographicHash>
    #include "qaesencryption.h"
    
    QAESEncryption encryption(QAESEncryption::AES_256, QAESEncryption::CBC);
    
    QString inputStr("The Advanced Encryption Standard (AES), also known by its original name Rijndael "
                     "is a specification for the encryption of electronic data established by the U.S. "
                    "National Institute of Standards and Technology (NIST) in 2001");
    QString key("your-string-key");
    QString iv("your-IV-vector");
    
    QByteArray hashKey = QCryptographicHash::hash(key.toLocal8Bit(), QCryptographicHash::Sha256);
    QByteArray hashIV = QCryptographicHash::hash(iv.toLocal8Bit(), QCryptographicHash::Md5);
    
    QByteArray encodeText = encryption.encode(inputStr.toLocal8Bit(), hashKey, hashIV);
    QByteArray decodeText = encryption.decode(encodeText, hashKey, hashIV);
    
    QString decodedString = QString(encryption.removePadding(decodeText));
    
    //decodedString == inputStr !!

    Example via static invocation

    Static invocation without creating instances, 256 bit key, ECB mode, starting from QString text/key

    #include <QCryptographicHash>
    #include "qaesencryption.h"
    
    QString inputStr("The Advanced Encryption Standard (AES), also known by its original name Rijndael "
                     "is a specification for the encryption of electronic data established by the U.S. "
                    "National Institute of Standards and Technology (NIST) in 2001");
    QString key("your-string-key");
    QString iv("your-IV-vector");
    
    QByteArray hashKey = QCryptographicHash::hash(key.toLocal8Bit(), QCryptographicHash::Sha256);
    QByteArray hashIV = QCryptographicHash::hash(iv.toLocal8Bit(), QCryptographicHash::Md5);
    
    //Static invocation
    QByteArray encrypted = QAESEncryption::Crypt(QAESEncryption::AES_256, QAESEncryption::CBC, 
                            inputStr.toLocal8Bit(), hashKey, hashIV);
    //...
    // Removal of Padding via Static function
    QString decodedString = QString(QAESEncryption::RemovePadding(decodeText));
    

    AES New Instructions Set

    To use the hardware acceleration provided by the AES New Instructions Set, define USE_INTEL_AES_IF_AVAILABLE If the CPU supports it, the code will switch to use AESNI automatically. The feature is enabled by default

    Unit Testing

    The unit testing vectors used are included in NIST-Recommendation for Block Cipher Modes of Operation

    Please note that this code is not audited or AES-certified by any competent authority, use it at your own risk.

    Dependencies

    • qtcore

    No OpenSSL required.

    Contact

    Question or suggestions are welcome! Please use the GitHub issue tracking to report suggestions or issues.

    License

    This software is provided under the UNLICENSE

    Known Issues

    Please take a look at the list of currently open issues

    项目简介

    Native Qt AES encryption class

    🚀 Github 镜像仓库 🚀

    源项目地址

    https://github.com/bricke/Qt-AES

    发行版本

    当前项目没有发行版本

    贡献者 14

    全部贡献者

    开发语言

    • C++ 71.4 %
    • C 14.6 %
    • CMake 7.5 %
    • Objective-C 4.9 %
    • QMake 1.7 %