Card |
---|
| Code Block |
---|
| int GRD_API GrdTransformEx(
HANDLE hGrd,
DWORD dwAlgoNum,
DWORD dwLng,
void *pData,
DWORD dwMethod,
DWORD dwIVLng
void *pIV
void *pReserved
); |
Expand |
---|
| hGrd | хэндл, через который будет выполнена данная операция | dwAlgoNum | номер аппаратного алгоритма с помощью которого будет производиться шифрование | dwLng | длина блока данных в байтах | pData | буфер данных для шифрования | dwMethod | cледующие флаги позволяют указать режим работы алгоритма и процесс шифрования: Биты 0-5 - режим работы алгоритма | GrdAM_ECB | Режим электронной кодовой книги (режим простой замены). Каждый блок открытого текста заменяется блоком шифротекста. Шифрование двух одинаковых блоков даст идентичный результат. Скорость обработки блоков в режиме ЕСВ фиксирована. Недостаток ECB, в сравнении c другими режимами шифрования, — сохранение статистических особенностей открытого текста. | GrdAM_CBC | Режим сцепления блоков шифротекста. Каждый блок открытого текста (кроме первого) побитово складывается по модулю 2 (операция XOR) с предыдущим результатом шифрования. Режим CBC лишён недостатка алгоритма EBCECB, но всё же имеет ряд недостатков с точки зрения безопасности. Например, возможно определить начало изменения данных при изменении шифротекста. | GrdAM_CFB | Режим с кодированной обратной связью | GrdAM_OFB | Режим с обратной связью по выходу | Бит 6 - резерв | Бит 7 - тип операции | GrdAM_Encode | Зашифровать блок данных | GrdAM_Decode | Расшифровать блок данных |
| dwIVLng | длина вектора инициализации: - для GSII64 - 8 байт, для AES128 - 16 байт. | pIV | указатель на вектор инициализации. Если в качестве указателя на вектор инициализации задан NULL, то шифрование пройдет корректно, при этом будет использован нулевой вектор | Reserved | не используется. Параметр должен быть равен NULL |
|
Expand |
---|
title | Возвращаемое значение функции |
---|
| GrdE_AlgoNotFound | Алгоритм с указанным номером не существует. | GrdE_CRCErrorFunc | Ошибка CRC при выполнении алгоритма. Эта ошибка обычно возникает, если длина преобразуемой последовательности не совпадает с заданной во время создания алгоритма. | GrdE_GPis0 | Счетчик алгоритма достиг нулевого значения. Результат алгоритма больше нельзя получить. |
|
Expand |
---|
| Функция GrdTransformEx позволяет шифровать данные с помощью аппаратного алгоритма ключа. Шифрование производится алгоритмом с числовым именем, заданным в параметре dwAlgoNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться. Длина массива преобразуемых данных (в байтах) pData задается параметром dwLng и зависит от режима работы алгоритма. Для режимов ECB и CBC длина данных должна быть кратной GrdARS_GSII64 (8 байт), максимально GrdAMRS_GSII64 (248 байт). Если задана длина массива, не кратная 8 байтам, функция возвращает код ошибки GrdE_InvalidArg. Для режимов CFB и OFB длина может быть произвольной, но не превышающей 255 байт. Параметр dwMethod задается суммой флагов (см. GRDAPI.H). Массив данных для преобразования должен находиться по адресу, указанному в параметре pData. Если функция выполнена успешно, по этому же адресу будет помещена последовательность преобразованных данных той же длины. В этом случае функция возвращает GrdE_OK. Скорость кодирования/декодирования напрямую зависит от длины dwLng блока данных pData, передаваемого в GrdTransformEx. Максимальная скорость достигается при максимальной длине блока. Если размер блока данных сильно превышает максимальное значение dwLng, его нужно разбивать на куски максимально возможной длины. Однако при таком подходе ключ (особенно с интерфейсом LPT) может оказываться занятым на более долгое время в течении каждой такой операции. Поэтому в приложениях, для которых это критично (например, со множественными независимыми параллельными запросами к ключу), лучше использовать более мелкие блоки. Для режимов, использующих сцепление блоков, необходимо задавать вектор инициализации pIV с длиной dwIVLng. При выполнении кодирования и декодирования необходимо задавать один и тот же вектор инициализации. Если кодирование/декодирование происходит в несколько приемов, то в качестве вектора инициализации нужно задавать значение, которое возвращается в pIV после выполнения предыдущей операции. Новый параметр (dwIVLng) имеет смысл для аппаратных алгоритмов с переменным вектором инициализации, которые появятся в будущем. На существующих алгоритмах (к примеру GSII64) это отразится лишь в том случае, если указывается длина вектора инициализации от 0 до 8 байт (включительно). При указании длины более 8 байт шифрование происходит с использованием первых 8 байт указанного вектора инициализации. При вызове функций GrdTransform, GrdTransformEx с нулевым указателем на вектор инициализации возвращается GrdE_OK, шифрование и последующее расшифрование происходит нормально в любых режимах (в т. ч. тех, которые требуют вектор инициализации). Ситуация полность аналогична использованию нулевого вектора инициализации или вектора инициализации нулевой длины. Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHash. |
|
Card |
---|
| Code Block |
---|
| public static GrdE GrdTransformEx(Handle grdHandle, GrdAlgNum algNum, byte[] data, GrdAM method, byte[] iv)
|
Expand |
---|
| grdHandle [in] Тип: Handle хэндл, через который будет выполнена данная операция. algNum [in] Тип: GrdAlgNum Номер аппаратного алгоритма, с помощью которого будет происходить шифрование. data [in] Тип: byte [ ] Буфер данных для шифрования. method [in] Тип: GrdAM Режим работы алгоритма и процесс шифрования. iv [in] Тип: byte [ ] Вектор инициализации. |
Expand |
---|
title | Возвращаемое значение метода |
---|
| GrdE.AlgoNotFound | Алгоритм с указанным номером не существует. | GrdE.CRCErrorFunc | Ошибка CRC при выполнении алгоритма. Эта ошибка обычно возникает, если длина преобразуемой последовательности не совпадает с заданной во время создания алгоритма. | GrdE.GPis0 | Счетчик алгоритма достиг нулевого значения. Результат алгоритма больше нельзя получить. |
|
Expand |
---|
| Метод GrdTransformEx позволяет шифровать данные с помощью аппаратного алгоритма ключа. Шифрование производится алгоритмом с числовым именем, заданным в параметре algNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться Длина массива преобразуемых данных (в байтах) data зависит от режима работы алгоритма. Для режимов ECB и CBC длина данных должна быть кратной GrdARS_GSII64 (8 байт), максимально GrdAMRS_GSII64 (248 байт). Для режимов CFB и OFB длина может быть произвольной, но не превышающей 255 байт. Параметр method, который задает метод преобразования определяется комбинацией флагов GrdAM. Массив данных для преобразования должен находиться по адресу, указанному в параметре data. Если метод выполнен успешно, по этому же адресу будет помещена последовательность преобразованных данных той же длины. В этом случае метод возвращает GrdE.OK. Скорость кодирования/декодирования напрямую зависит от длины блока данных data, передаваемого в GrdTransformEx. Максимальная скорость достигается при максимальной длине блока. Если размер блока данных сильно превышает максимальное значение, его нужно разбивать на куски максимально возможной длины. Однако при таком подходе ключ (особенно с интерфейсом LPT) может оказываться занятым на более долгое время в течении каждой такой операции. Поэтому в приложениях, для которых это критично (например, со множественными независимыми параллельными запросами к ключу), лучше использовать более мелкие блоки. Для режимов, использующих сцепление блоков, необходимо задавать вектор инициализации iv. При выполнении кодирования и декодирования необходимо задавать один и тот же вектор инициализации. Если кодирование/декодирование происходит в несколько приемов, то в качестве вектора инициализации нужно задавать значение, которое возвращается в iv после выполнения предыдущей операции. При вызове методов GrdTransform, GrdTransformEx с нулевым указателем на вектор инициализации возвращается GrdE.OK, шифрование и последующее расшифрование происходит нормально в любых режимах (в т. ч. тех, которые требуют вектор инициализации). Ситуация полность аналогична использованию нулевого вектора инициализации или вектора инициализации нулевой длины. Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHash. |
|
Card |
---|
| Code Block |
---|
| public static GrdE GrdTransformEx(Handle grdHandle, int algoNum, byte[] data, GrdAM method, byte[] iv) |
Expand |
---|
| grdHandle [in] Тип: Handle хэндл, через который будет выполнена данная операция. algNum [in] Тип: int Номер аппаратного алгоритма, с помощью которого будет происходить шифрование. data [in] Тип: byte [ ] Буфер данных для шифрования. method [in] Тип: GrdAM Режим работы алгоритма и процесс шифрования. iv [in] Тип: byte [ ] Вектор инициализации. |
Expand |
---|
title | Возвращаемое значение метода |
---|
| GrdE.AlgoNotFound | Алгоритм с указанным номером не существует. | GrdE.CRCErrorFunc | Ошибка CRC при выполнении алгоритма. Эта ошибка обычно возникает, если длина преобразуемой последовательности не совпадает с заданной во время создания алгоритма. | GrdE.GPis0 | Счетчик алгоритма достиг нулевого значения. Результат алгоритма больше нельзя получить. |
|
Expand |
---|
| Метод GrdTransformEx позволяет шифровать данные с помощью аппаратного алгоритма ключа. Шифрование производится алгоритмом с числовым именем, заданным в параметре algNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться Длина массива преобразуемых данных (в байтах) data зависит от режима работы алгоритма. Для режимов ECB и CBC длина данных должна быть кратной GrdARS_GSII64 (8 байт), максимально GrdAMRS_GSII64 (248 байт). Для режимов CFB и OFB длина может быть произвольной, но не превышающей 255 байт. Параметр method, который задает метод преобразования определяется комбинацией флагов GrdAM. Массив данных для преобразования должен находиться по адресу, указанному в параметре data. Если метод выполнен успешно, по этому же адресу будет помещена последовательность преобразованных данных той же длины. В этом случае метод возвращает GrdE.OK Скорость кодирования/декодирования напрямую зависит от длины блока данных data, передаваемого в GrdTransformEx. Максимальная скорость достигается при максимальной длине блока. Если размер блока данных сильно превышает максимальное значение, его нужно разбивать на куски максимально возможной длины. Однако при таком подходе ключ (особенно с интерфейсом LPT) может оказываться занятым на более долгое время в течении каждой такой операции. Поэтому в приложениях, для которых это критично (например, со множественными независимыми параллельными запросами к ключу), лучше использовать более мелкие блоки. Для режимов, использующих сцепление блоков, необходимо задавать вектор инициализации iv. При выполнении кодирования и декодирования необходимо задавать один и тот же вектор инициализации. Если кодирование/декодирование происходит в несколько приемов, то в качестве вектора инициализации нужно задавать значение, которое возвращается в iv после выполнения предыдущей операции. При вызове методов GrdTransform, GrdTransformEx с нулевым указателем на вектор инициализации возвращается GrdE.OKПеречисление GrdE, шифрование и последующее расшифрование происходит нормально в любых режимах (в т. ч. тех, которые требуют вектор инициализации). Ситуация полность аналогична использованию нулевого вектора инициализации или вектора инициализации нулевой длины. Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHash. |
|
|