Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/quasarapp/qt-secret

Simple encryption library supporting RSA and AES algorithms.
https://github.com/quasarapp/qt-secret

aes alghorithm algorithms cmake cqtdeployer cryptography library qmake qt quasarapp rsa

Last synced: 6 days ago
JSON representation

Simple encryption library supporting RSA and AES algorithms.

Awesome Lists containing this project

README

        

# ![Qt-Secret Logo](res/png/Qt-Secret_Banner_web.png)

# Note
The OpenSSL library is better for security and performance, so we implemented a Qt wrapper library to make it easier to use. See the [EasySSL](https://github.com/QuasarApp/easyssl) library.

Fast encryption library supporting RSA and AES algorithms.

# Futures
The Qt-Secret library supports the following algorithms:

### RSA
The current implementation supports the following key sizes:
#### Supported sizes
* RSA64
* RSA128
* RSA256
* RSA512
* RSA1024
* RSA2048
* RSA3072
* RSA4096
* RSA6144
* RSA8192

#### Supported futures

* Encryption and decryption of messages.
* Signature and verification of the message signature.

### AES
AES implementation was borrowed from [bricke](https://github.com/bricke/Qt-AES), because it fulfills the goals of this library.

Individual thanks [bricke](https://github.com/bricke) for implementing the AES encryption class.

#### AES Levels
The class supports all AES key lengths

* 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

# Build

## with qmake

* git clone https://github.com/QuasarApp/Qt-Secret.git
* cd Qt-Secret
* git submodule update --init --recursive
* sudo apt install qt5-default
* qmake -r DEFINE+=WITHOUT_GUI Qt-Secret.pro
> DEFINE+=WITHOUT_GUI fot build without gui example, if you want build gui example remove this line. For build the gui example you need to install qml controls 2 in you os. Try **sudo apt install qml-module-qtquick-controls2 qtdeclarative5-dev qtdeclarative5-qtquick2-plugin**
* make -j8
* make test #(for testing)

## with cmake

* git clone https://github.com/QuasarApp/Qt-Secret.git
* cd Qt-Secret
* git submodule update --init --recursive
* sudo apt install qt5-default
* cmake -DCMAKE_PREFIX_PATH=you/Qt/dir .
* make -j8
* make test #(for testing)

# Include

## for qmake projects

* cd yourRepo
* git submodule add https://github.com/QuasarApp/Qt-Secret.git # add the repository of Qt-Secret into your repo like submodule
* git submodule update --init --recursive
* Add to the list of libraries for the Qt-Secret assembly. For example, you can create Main.Pro in which connect Qt-Secret and your project.pro files as subprojects.

**Main.pro:**
``` qmake
TEMPLATE = subdirs
CONFIG += ordered

SUBDIRS += \
Qt-Secret \
MyProject
```
* Include in your MyProject.pro file the pri file of Qt-Secret library
``` qmake
include($$PWD/../Qt-Secret/src/Qt-Secret.pri)
```
* Rebuild your project

### For cmake projects

* cd yourRepo
* git submodule add https://github.com/QuasarApp/Qt-Secret.git # add the repository of Qt-Secret into your repo like submodule
* git submodule update --init --recursive
* Include in your CMakeLists.txt file the main CMakeLists.txt file of Qt-Secret library
``` cmake
add_subdirectory(Qt-Secret)
target_link_libraries(MyBinary PUBLIC Qt-Secret)
```
* Rebuild your project

#### Note

By Default Qt-Secret makes as a static library. If you want to create a shared library just add the BUILD_SHARED_LIBS into your main CMakeLists.txt file. Example :

```cmake
set(BUILD_SHARED_LIBS ON)
add_subdirectory(Qt-Secret)
target_link_libraries(MyBinary PUBLIC Qt-Secret)
```

## For other build systems

* cd yourRepo
* git submodule add https://github.com/QuasarApp/Qt-Secret.git # add the repository of Qt-Secret into your repo like submodule
* git submodule update --init --recursive
* Add the rule for build Qt-Secret
* Add INCLUDEPATH and LIBS for your build system
* Rebuild your project

#### Detailed instructions of include in QtCreator see [here](Doc/QtCreator.md).

# Usage

## RSA

### Encryption and decryption of messages.

``` cpp
#include
#include

bool testEncryptAndDecryptExample() {

QByteArray pub, priv;
QRSAEncryption e(QRSAEncryption::Rsa::RSA_2048);
e.generatePairKey(pub, priv); // or other rsa size

QByteArray msg = "test message";

auto encryptMessage = e.encode(msg, pub);

if (encryptMessage == msg)
return false;

auto decodeMessage = e.decode(encryptMessage, priv);

return decodeMessage == msg;
}

int main() {
if (testEncryptAndDecryptExample()) {
qInfo() << "Success!";
}
}
```

### Signature and verification of the message signature.

``` cpp
#include
#include

bool testExample() {
QByteArray pub, priv;
QRSAEncryption e(QRSAEncryption::Rsa::RSA_2048);
e.generatePairKey(pub, priv); // or other rsa size

QByteArray msg = "test message";

auto signedMessage = e.signMessage(msg, priv);

if (e.checkSignMessage(signedMessage, pub)) {
qInfo() <<" message signed success";
return true;
}

return false;

}

int main() {
if (testExample()) {
qInfo() <<"success!";
}
}
```

## AES

Sample code using a 128bit key in ECB mode
``` cpp
#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
``` cpp
#include
#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
``` cpp
#include
#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));
```