//! \~\ingroup Crypt //! \~\file picrypt.h //! \brief //! \~english Cryptographic using libsodium //! \~russian Шифрование с помощью libsodium /* PIP - Platform Independent Primitives Cryptographic class using lib Sodium Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PICRYPT_H #define PICRYPT_H #include "pip_crypt_export.h" #include "pistring.h" //! \~\ingroup Crypt //! \~\brief //! \~english Class for encrypting and decrypting data. //! \~russian Класс для шифрования и дешифрования данных. //! \details //! \~english Class providing cryptographic operations using the libsodium library, including encryption, decryption, hashing, and digital //! signatures. It supports both instance-based and static method-based operations. //! \~russian Класс, предоставляющий криптографические операции с использованием библиотеки libsodium, включая шифрование, дешифрование, //! хэширование и цифровые подписи. Поддерживаются операции как на основе экземпляра класса, так и на основе статических методов. //! \note //! \~english Requires libsodium library initialization. All methods are thread-safe when using different keys. //! \~russian Требуется инициализация библиотеки libsodium. Все методы потокобезопасны при использовании различных ключей. class PIP_CRYPT_EXPORT PICrypt { public: //! \~english Constructor that generates a random key. //! \~russian Конструктор, генерирующий случайный ключ. PICrypt(); //! \~english Destructor. //! \~russian Деструктор. ~PICrypt(); //! \~english Set key to "key", key size must be a \a sizeKey(). //! \~russian Установить ключ "key", размер ключа должен быть равен \a sizeKey(). bool setKey(const PIByteArray & key); //! \~english Generate and set key from keyphrase "secret". //! \~russian Генерировать и установить ключ из ключевой фразы "secret". bool setKey(const PIString & secret); //! \~english Returns current key. //! \~russian Возвращает текущий ключ. PIByteArray key() { return key_; } //! \~english Encrypt given data "data", result size will be increased by \a sizeCrypt(). //! \~russian Зашифровать данные "data", размер результата увеличится на \a sizeCrypt(). PIByteArray crypt(const PIByteArray & data); //! \~english Decrypt given data "crypt_data". //! \~russian Расшифровать данные "crypt_data". PIByteArray decrypt(const PIByteArray & crypt_data, bool * ok = 0); //! \~english Encrypt given data "data" with key "key", result size will be increased by \a sizeCrypt(). //! \~russian Зашифровать данные "data" ключом "key", размер результата увеличится на \a sizeCrypt(). static PIByteArray crypt(const PIByteArray & data, PIByteArray key); //! \~english Decrypt given data "crypt_data" with key "key". //! \~russian Расшифровать данные "crypt_data" ключом "key". static PIByteArray decrypt(const PIByteArray & crypt_data, PIByteArray key, bool * ok = 0); //! \~english Generate hash from keyphrase "secret", may be used as a key for encryption. //! \~russian Генерировать хэш из ключевой фразы "secret", может использоваться в качестве ключа для шифрования. static PIByteArray hash(PIString secret); //! \~english Generate hash from bytearray. //! \~russian Генерировать хэш из массива байт. static PIByteArray hash(const PIByteArray & data); //! \~english Generate hash from bytearray using provided key. //! \~russian Генерировать хэш из массива байт с использованием предоставленного ключа. static PIByteArray hash(const PIByteArray & data, const unsigned char * key, size_t keylen); //! \~english Returns hash size. //! \~russian Возвращает размер хэша. static size_t sizeHash(); //! \~english Generate short hash from string "s", may be used for hash table. //! \~russian Генерировать короткий хэш из строки "s", может использоваться для хэш-таблиц. static ullong shorthash(const PIString & s, PIByteArray key = PIByteArray()); //! \~english Generate random key. //! \~russian Генерировать случайный ключ. static PIByteArray generateKey(); //! \~english Generate random buffer. //! \~russian Генерировать случайный буфер. static PIByteArray generateRandomBuff(int size); //! \~english Returns key size. //! \~russian Возвращает размер ключа. static size_t sizeKey(); //! \~english Returns size which be added to data size in encryption process. //! \~russian Возвращает размер, который будет добавлен к размеру данных в процессе шифрования. static size_t sizeCrypt(); //! \~english Function randomly generates a secret key and a corresponding public key for digital signature. //! \~russian Функция случайным образом генерирует секретный ключ и соответствующий ему открытый ключ для цифровой подписи. static bool generateSignKeys(PIByteArray & public_key, PIByteArray & secret_key); //! \~english Function generates a secret key from input data and a corresponding public key for digital signature. //! \~russian Функция генерирует секретный ключ из входных данных и соответствующий ему открытый ключ для цифровой подписи. static bool generateSignKeys(PIByteArray & public_key, PIByteArray & secret_key, const PIByteArray & seed); //! \~english Function extract sign public key from sing secret key. //! \~russian Функция извлекает открытый ключ для подписи из секретного ключа для подписи. static PIByteArray extractSignPublicKey(const PIByteArray & secret_key); //! \~english Calculate digital signature for data. //! \~russian Вычислить цифровую подпись для данных. PIByteArray signMessage(const PIByteArray & data, const PIByteArray & secret_key); //! \~english Verify digital signature of signed message. //! \~russian Проверить цифровую подпись подписанного сообщения. bool verifySign(const PIByteArray & data, const PIByteArray & signature, const PIByteArray & public_key); //! \~english Function randomly generates a secret key and a corresponding public key for authenticated encryption. //! \~russian Функция случайным образом генерирует секретный ключ и соответствующий ему открытый ключ для аутентифицированного //! шифрования. static bool generateKeypair(PIByteArray & public_key, PIByteArray & secret_key); //! \~english Function generates a secret key from input data and a corresponding public key for authenticated encryption. //! \~russian Функция генерирует секретный ключ из входных данных и соответствующий ему открытый ключ для аутентифицированного //! шифрования. static bool generateKeypair(PIByteArray & public_key, PIByteArray & secret_key, const PIByteArray & seed); //! \~english Encrypt given data "data". //! \~russian Зашифровать данные "data". PIByteArray crypt(const PIByteArray & data, const PIByteArray & public_key, const PIByteArray & secret_key); //! \~english Decrypt given data "crypt_data". //! \~russian Расшифровать данные "crypt_data". PIByteArray decrypt(const PIByteArray & crypt_data, const PIByteArray & public_key, const PIByteArray & secret_key, bool * ok = 0); //! \~english Generate password hash from "password". //! \~russian Генерировать хэш пароля из "password". static PIByteArray passwordHash(PIString password, const PIByteArray & seed); //! \~english Returns libsodium version. //! \~russian Возвращает версию libsodium. static PIString version(); private: static bool init(); PIByteArray nonce_, key_; }; #endif // PICRYPT_H