mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 06:06:00 -06:00
227 lines
No EOL
12 KiB
C++
227 lines
No EOL
12 KiB
C++
topic "Инструкция по классам поточного (де)шифрования AES";
|
||
[2 $$0,0#00000000000000000000000000000000:Default]
|
||
[l288;i1120;a17;O9;~~~.1408;2 $$1,0#10431211400427159095818037425705:param]
|
||
[a83;*R6 $$2,5#31310162474203024125188417583966:caption]
|
||
[H4;b83;*4 $$3,5#07864147445237544204411237157677:title]
|
||
[i288;O9;C2 $$4,6#40027414424643823182269349404212:item]
|
||
[b42;a42;2 $$5,5#45413000475342174754091244180557:text]
|
||
[l288;b17;a17;2 $$6,6#27521748481378242620020725143825:desc]
|
||
[l321;C@5;1 $$7,7#20902679421464641399138805415013:code]
|
||
[b2503;2 $$8,0#65142375456100023862071332075487:separator]
|
||
[*@(0.0.255)2 $$9,0#83433469410354161042741608181528:base]
|
||
[C2 $$10,0#37138531426314131251341829483380:class]
|
||
[l288;a17;*1 $$11,11#70004532496200323422659154056402:requirement]
|
||
[i417;b42;a42;O9;~~~.416;2 $$12,12#10566046415157235020018451313112:tparam]
|
||
[b167;C2 $$13,13#92430459443460461911108080531343:item1]
|
||
[i288;a42;O9;C2 $$14,14#77422149456609303542238260500223:item2]
|
||
[*@2$(0.128.128)2 $$15,15#34511555403152284025741354420178:NewsDate]
|
||
[l321;*C$7;2 $$16,16#03451589433145915344929335295360:result]
|
||
[l321;b83;a83;*C$7;2 $$17,17#07531550463529505371228428965313:result`-line]
|
||
[l160;*C+117 $$18,5#88603949442205825958800053222425:package`-title]
|
||
[2 $$19,0#53580023442335529039900623488521:gap]
|
||
[C2 $$20,20#70211524482531209251820423858195:class`-nested]
|
||
[b50;2 $$21,21#03324558446220344731010354752573:Par]
|
||
[{_}%EN-US
|
||
[s2; Инструкция по классам поточного
|
||
(де)шифрования AES`*Stream&]
|
||
[s5; &]
|
||
[s0; Данные классы решают следующие проблемы:&]
|
||
[s0;i150;O2; Максимальная защита персональных
|
||
данных при хранении их байтового
|
||
представления в общем доступе&]
|
||
[s0;i150;O2; Возможность работы с большими
|
||
объёмами информации (свыше 4 ГБ) без
|
||
использования значительных системных
|
||
ресурсов (за счёт поточного шифрования)
|
||
и без потери криптографической стойкости&]
|
||
[s0; &]
|
||
[s0; Для этого, в качестве основы была
|
||
выбрана библиотека OpenSSL и алгоритм
|
||
шифрования AES (Rijndael) как принятый стандарт
|
||
в обеспечении безопасности информации.&]
|
||
[s0; Для работы с классами, [* требуется
|
||
установленная библиотека OpenSSL]. Как
|
||
установить OpenSSL, смотрите [^topic`:`/`/AESStream`/src`/Installing`_OpenSSL`$en`-us^ з
|
||
десь].&]
|
||
[s0; &]
|
||
[s2; &]
|
||
[s2; 1. Шифрование&]
|
||
[s5;i150;O1; Создать киптографически стойкий
|
||
ключ шифрования. Длина ключа может
|
||
быть 16, 24 или 32 байта (128/192/256 бит соответствен
|
||
но). Ключи другого размера не поддерживаются
|
||
. Пожалуйста, обратите внимание на
|
||
то, что в некоторых странах определённые
|
||
размеры ключей запрещены законодательно.&]
|
||
[s7; String key(AESRandomString(32));&]
|
||
[s5;l192; [*_ NB] Не используйте в качестве ключа
|
||
пароли пользователя `- это сводит
|
||
на нет всю систему защиты.&]
|
||
[s5; &]
|
||
[s5;i150;O1; Создать объект класса AESEncoderStream
|
||
для того, чтобы начать шифрование
|
||
с его помощью. &]
|
||
[s7; AESEncoderStream aesEncoder(dataSize, key);&]
|
||
[s5;l192; В качестве аргументов идут длина
|
||
шифруемых данных (в байтах) и созданный
|
||
выше ключ.&]
|
||
[s5;l192; [*_ NB] При шифровании в поточном режиме,
|
||
первым аргументом должна быть передана
|
||
[* полная ]длина всего потока данных.&]
|
||
[s5;l192; Созданный объект предназначен
|
||
для шифрования одного потока байтов.
|
||
Для шифрования других данных следует
|
||
создавать другие объекты AESEncoderStream.&]
|
||
[s5;l192; Если данный тип ключа не поддерживается
|
||
библиотекой, конструктор выбросит
|
||
исключение типа (const char `*) с описанием
|
||
ошибки.&]
|
||
[s5; &]
|
||
[s5;i150;O1; Сам процесс шифрования данных:&]
|
||
[s7; String someData;&]
|
||
[s7; //...&]
|
||
[s7; aesEncoder << someData;&]
|
||
[s5;l192; После чего получаем из объекта
|
||
выходные зашифрованные данные:&]
|
||
[s7; sOut << aesEncoder;&]
|
||
[s5; &]
|
||
[s5;i150;O1; Поточный режим. Класс AESEncoderStream
|
||
будет `"принимать`" в себя данные любыми
|
||
кусками до тех пор, пока их размер
|
||
не станет равным длине, указанной
|
||
в его конструкторе. При каждом вызове
|
||
`"приёма`" данных в AESEncoderStream, происходит
|
||
его шифрование, при этом оперативная
|
||
память, требуемая для шифрования,
|
||
сравнима с размером шифруемого куска
|
||
данных. Таким образом, можно шифровать
|
||
объёмы данных практически любого
|
||
размера (ограничение сверху `- размер
|
||
64`-битного беззнакового целого) без
|
||
существенных затрат оперативной
|
||
памяти.&]
|
||
[s7; for (...) &]
|
||
[s7; `{&]
|
||
[s7; -|/`*...`*/&]
|
||
[s7; -|aesEncoder << someDataXXX;&]
|
||
[s7; -|/`*...`*/&]
|
||
[s7; -|sOut << aesEncoder;&]
|
||
[s7; `}&]
|
||
[s0;l224; На выходе из объекта будет только
|
||
та часть зашифрованных данных, которая
|
||
была сформирована из необработанных
|
||
входных данных. При этом следует учитывать,
|
||
что процесс шифрования идёт по кускам.
|
||
Поэтому в некоторых итерациях цикла
|
||
поточного шифрования на выходе может
|
||
быть пустая строка. Когда на вход
|
||
поступит достаточное количество
|
||
дополнительных входных байтов, объект
|
||
выдаст необходимое число байтов на
|
||
выходе.&]
|
||
[s0;l224; Структура выходных данных никак
|
||
не зависит от размера и числа кусков
|
||
при шифровании в поточном режиме.
|
||
При дешифровании выходных данных
|
||
с правильным ключом, всегда будут
|
||
получаться оригинальные данные.&]
|
||
[s0; &]
|
||
[s0; &]
|
||
[s2; 2. Дешифрование&]
|
||
[s5; За дешифрование отвечает класс AESDecoderStream.
|
||
Для дешифрования требуется знать
|
||
ключ. Если задать неправильный ключ
|
||
и начать дешифрование, будет выброшено
|
||
исключение типа (const char `*), содержащее
|
||
строку с указанием ошибки. Исключение
|
||
того же типа может быть выброшено
|
||
в конструкторе объекта при появлении
|
||
тех или иных проблем.&]
|
||
[s5; &]
|
||
[s5;i150;O1; Создание объекта для дешифрования.
|
||
Объект AESDecoderStream дешифрует один поток
|
||
данных и поддерживает поточный режим.
|
||
Для дешифровки других потоков данных
|
||
следует создавать другой объект.&]
|
||
[s7; AESDecoderStream aesDecoder(key);&]
|
||
[s5; &]
|
||
[s5;i150;O1; Дешифрование.&]
|
||
[s7; aesDecoder << encryptedData;&]
|
||
[s5;l160; После чего на выходе получаем
|
||
дешифрованные данные:&]
|
||
[s7; sDecoded << aesDecoder;&]
|
||
[s5;l160; Также следует помнить о возможности
|
||
выброса исключения в случае если
|
||
установленный ключ не совпадает с
|
||
ключом, с которым данные были зашифрованы.&]
|
||
[s5; &]
|
||
[s5;i150;O1; Поточный режим. Организуется
|
||
аналогично поточному режиму класса
|
||
AESEncoderStream. Шифрованные байты точно
|
||
также можно подавать частями и забирать
|
||
частями дешифрованные данные. С учётом
|
||
размера блоков шифрования, в некоторых
|
||
итерациях цикла поточного дешифрования,
|
||
на выходе может быть пустая строка
|
||
до тех пор, пока число дополнительных
|
||
байтов на входе не достигнет необходимой
|
||
величины.&]
|
||
[s5;l160; Сложнее дело обстоит с определением
|
||
оригинального размера шифрованных
|
||
данных при дешифовании в поточном
|
||
режиме. Дело в том, что определить
|
||
его возможно только на определённом
|
||
этапе дешифрования (когда на вход
|
||
объекта поступит достаточное число
|
||
байтов для дешифрования заголовка).
|
||
До тех пор, пока заголовок не дешифрован,
|
||
функция`-член возвращает нулевой
|
||
размер исходных данных. Поэтому, проверять
|
||
размер оригинальных данных следует
|
||
с оторожностью:&]
|
||
[s7; if (!aesDecoder.GetSize())&]
|
||
[s7; `{ //still no answer...&]
|
||
[s7; `}&]
|
||
[s7; else&]
|
||
[s7; `{//now I know original data size!&]
|
||
[s7; `}&]
|
||
[s5;l160; В момент дешифрования заголовка
|
||
также может быть выброшено исключение,
|
||
если оригинальный ключ не совпал
|
||
с установленным. При этом, сам оригинальный
|
||
ключ не хранится в шифрованных данных
|
||
ни в каком виде.&]
|
||
[s5;l160; Цикл поточного дешифрования похож
|
||
на цикл поточного шифрования:&]
|
||
[s7; for (...) &]
|
||
[s7; `{&]
|
||
[s7; -|/`*...`*/&]
|
||
[s7; -|aesDecoder << encryptedDataXXX;&]
|
||
[s7; -|/`*...`*/&]
|
||
[s7; -|sOut << aesDecoder;&]
|
||
[s7; `}&]
|
||
[s5; &]
|
||
[s5; &]
|
||
[s2; 3. Примечания&]
|
||
[s5;i150;O2; Размер шифрованных данных больше
|
||
размера исходных данных на 32 байта,
|
||
с учётом выравнивания по 16`-ти байтовой
|
||
границе. Например, если длина исходных
|
||
данных равна 170, длина шифрованных
|
||
данных будет равна:&]
|
||
[s5;l192; 170 с округлением по 16`-ти байтовой
|
||
границе `= 176&]
|
||
[s5;l192; `+&]
|
||
[s5;l192; 32 байта&]
|
||
[s5;l192; `= 208 байтов.&]
|
||
[s0; &]
|
||
[s0; &]
|
||
[s2; 4. Известные проблемы&]
|
||
[s0;i150;O0; Пакет не компилируется под Win32
|
||
при помощи gcc/MSYS.&]
|
||
[s0; &]
|
||
[s0; Если у Вас есть любая информация
|
||
по их решению, либо о других проблемах
|
||
в пакете, пожалуйста, пишите [^http`:`/`/www`.ultimatepp`.org`/forum`/index`.php`?t`=msg`&th`=4640`&start`=0`&^ с
|
||
юда].&]
|
||
[s0; ] |