Официальная страница / Official page
(Rus)
RC5Simple - это простая мультиплатформенная криптографическая C++ библиотека, которая предназначена для шифрования/дешифровки массивов и файлов. Шифрация происходит по алгоритму RC5-32/12/16 c CBC-режимом сцепления блоков шифротекста (см. описание в Wikipedia).
Библиотека RC5Simple предназначена для работы с небольшими объемами данных (до 4Gb). Поддерживается работа как на 32-х битных системах, так и на 64-х битных.
Библиотека поставляется в виде исходников, содержит примеры шифрования и дешифровки массивов байт и файлов. Данная библиотека разрабатывалась для использования в программах, хранящих приватные данные пользователей.
Лицензия: GPL v.3 и BSD
Последняя актуальная версия: 1.30 (14.12.2013)
Скачать
RC5Simple v.1.23 (Source + documentation + examples, 83 Кб)
RC5Simple v.1.28 (Source + documentation + examples, 156 Кб)
RC5Simple v.1.30 (Source + documentation + examples, 243 Кб)
Репозитарий на GitHub
Формат данных
Последний актуальный формат №3 представлен на рисунке:
Увеличить
Использование
Вначале следует подключить заголовок:
#include "RC5Simple.h"
Шифрация/дешифрация даных происходит с помощью объекта класса RC5Simple. Создание объекта этого класса выглядит так:
RC5Simple rc5;
Для шифрации необходим ключ длиной в 16 байт. В качестве ключа можно использовать MD5-сумму пароля (как раз 16 байт). Для лучшего результата шифрования, перед получением MD5-суммы необходимо дополнить пароль "солью" и пропустить его через перемешивающий алгоритм на число раундов более тысячи (например PBKDF2). В дальнейшем "соль" можно хранить в открытом виде в связке с зашифрованным объектом.
Представление входных и выходных данных
Библиотека RC5Simple работает с данными в виде STL-векторов. Однако, зачастую, в C/C++ программах в качестве байтовых массивов используются массивы с ячейками типа unsigned char.
Ниже приведен пример создания некоего 16-ти байтного ключа в виде массива unsigned char, и преобразование его в STL вектор:
#define KEY_LEN 16
// Define key as array
unsigned char key[KEY_LEN];
// Generate key
for(int i=0; i<KEY_LEN; i++)
key[i]=i*2;
// Define key as vector
vector<unsigned char> v_key(KEY_LEN);
// Convert array to vector
for(int i=0; i<KEY_LEN; i++)
v_key[i]=key[i];
Шифрация и дешифрация
Перед началом шифрации или дешифрации необходимо установить ключ с помощью метода RC5_SetKey:
rc5.RC5_SetKey(v_key);
Шифрация массива байт происходит с помощью метода RC5_Encrypt:
rc5.RC5_Encrypt(v_data, v_crypt_data);
В результате вызова этого метода, в STL векторе v_crypt_data будут находиться зашифрованные данные.
Дешифрация массива байт происходит с помощью метода RC5_Decrypt:
rc5.RC5_Decrypt(v_crypt_data, v_data);
В результате вызова этого метода, в STL векторе v_data будут находиться расшифрованные данные.
Шифрация файла происходит с помощью метода RC5_EncryptFile:
rc5.RC5_EncryptFile("example.txt", "example.txt.encrypt");
В первом параметре указывается имя исходного файла, во втором параметре имя результирующего зашифрованного файла.
Дешифрация файла происходит с помощью метода RC5_DecryptFile:
rc5.RC5_DecryptFile("example.txt.encrypt", "example.txt.decrypt");
В первом параметре указывается имя исходного зашифрованного файла, во втором параметре имя результирующего расшифрованного файла.
После вызова любого метода объекта RC5Simple можно узнать код ошибки. Другими словами, можно выяснить, не возникло ли при выполнении метода какой-нибудь ошибки. Для этого, начиная с версии 1.28, существует метод RC5_GetErrorCode(). Если он возвращает 0, значит ошибок небыло. Число, отличное от нуля, свидетельствует о возникновении ошибки при выполнении метода. Перечень кодов ошибок RC5_ERROR_CODE_X и их описания находятся в заголовочном файле RC5Simple.h.
История версий
Версия 1.15
Первая публичная версия
Версия 1.16
- Исправлены предупреждения о сравнении знакового и беззнакового числа в методах RC5_Setup() и RC5_EncDecFile() возникающие при строгих опциях компилятора;
- В прототип конструктора добавлен аргумент enableRandomInit, который по-умолчанию равен false. Это необходимо для того, чтобы пользователь мог управлять инициализацией генератора случайных чисел. Если в основной программе сделана инициализация, то инициализация в данном классе не требуется, и по-умолчанию теперь отключена.
Версии 1.17 - 1.19
Промежуточные отладочные версии
Версия 1.20
- Изменена реализация механизма сцепления блоков шифротекста с упрощенного, предложенного в Reference implementation of RC5-32/12/16 in C RSA Data Security Inc, 1995 на полный CBC, (см. описание в Wikipedia http://ru.wikipedia.org/wiki/Режим_сцепления_блоков_шифротекста);
- Скорость шифрации/дешифрации данных увеличена в 2,5 раз;
- Добавлен каталог /doc. В нем размещено описание формата данных и HOWTO по использованию библиотеки RC5Simple.
Версии 1.21 - 1.22
Промежуточные отладочные версии с поддержкой 64-х бит
Версия 1.23 (16.07.2011)
Сделана поддержка 64-х битных архитектур
Версии 1.24 - 1.27
Промежуточные отладочные версии
Версия 1.28 (08.12.2013)
- Сделана поддержка форматов хранения данных. Формат 1 - это первый формат, использующийся вплоть до версии 1.23, формат 2 - это новый формат с усиленным форматом шифрования;
- В формате 2 (и всех последующих) присутсвует сигнатура RC5SIMP, после которой следует один байт версии формата данных;
- По умолчанию идет шифрация в формат 2;
- В формате 2, помимо вектора инициализации, добавлен дополнительный блок случайных данных, размещаемый в шифрованном тексте. Данная мера предотвращает атаку при наличии нескольких образцов шифрованного текста по заранее известному началу открытого текста. Пользоваться устаревшей версией (форматом 1) строго не рекомендуется;
- Сделана возможность принудительного выбора формата шифрации/дешифрации для сохранения совместимости с предыдущей версией. Выбор формата осуществляется функцией
void RC5_SetFormatVersionForce(unsigned char formatVersion);
- Добавлено несколько дополнительных отладочных сообщений;
- Проведены тесты упаковки-распаковки форматов 1 и 2;
- Прописаны правильные смещения для корректной распаковки формата 1;
- Добавлено свойство, хранящее последнюю ошибку;
- Добавлен метод получения последней ошибки RC5_GetErrorCode();
- Вывод сообщения в консоль при возникновении ошибки заменен запоминанием кода последней ошибки;
- В заголовочном файле прописаны коды ошибок RC5_ERROR_CODE_X и их описания
- В документацию добавлена графическая схема формата 2 в виде *.png и *.svg файлов
Версия 1.30 (14.12.2013)
- Добавлен формат 3. В предыдущем формате 2 обнаружено необоснованное занижение количества первичных случайных данных на половину длины ключа шифрования. В формате 3 первичные случайные данные имеют полную ширину ключа шифрования
- По умолчанию идет шифрация в формат 3
- В метод RC5_Encrypt добавлена установка кода ошибки при попытке зашифровать пустые данные
- В метод RC5_Decrypt добавлена установка кода ошибки при попытке расшифровать пустые данные
- В метод RC5_Decrypt добавлена установка кода ошибки при попытке расшифровать данные с некорректной длинной
- В методах расшифровки проставлены правильные константы для смещений данных в разных форматах хранения
- Произведена проверка через valgrind упаковки/распаковки в каждом из форматов. Везде имеем отчет ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
- Фиксация номера версии
- Пройдены тесты шифрации/дешифрации данных на совместимость с предыдущими версиями
- Пройдены тесты по интеграции и работе в рамках MyTetra
- Удалена информация об отвлекающих факторах
- Финальный коммит, присвоение тега версии