- Created by Dyakov Alexey, last modified by Guardant on Nov 09, 2014
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 106 Next »
Функция(метод) GrdTransformEx шифрует или расшифровывает блок данных при помощи симметричного аппаратного алгоритма (GSII64 или AES).
int GRD_API GrdTransformEx( HANDLE hGrd, DWORD dwAlgoNum, DWORD dwLng, void *pData, DWORD dwMethod, DWORD dwIVLng void *pIV void *pReserved );
hGrd |
хэндл, через который будет выполнена данная операция |
||||||||||||||||||
dwAlgoNum |
номер аппаратного алгоритма с помощью которого будет производиться шифрование или расшифрование |
||||||||||||||||||
dwLng |
длина буфера данных в байтах |
||||||||||||||||||
pData |
указатель на буфер данных открытого или зашифрованного текста |
||||||||||||||||||
dwMethod |
cледующие флаги позволяют указать режим работы алгоритма и тип операции:
|
||||||||||||||||||
dwIVLng |
длина вектора инициализации: |
||||||||||||||||||
pIV |
указатель на вектор инициализации для режимов шифрования CBC, CFB и OFB. Для режима ECB должен быть равен NULL |
||||||||||||||||||
Reserved |
не используется. Параметр должен быть равен NULL |
GrdE_OK | Операция выполнена успешно. |
Алгоритма с указанным номером не существует. |
|
GrdE_InvalidArg | Задано недопустимое значение одного из аргументов функции. |
Для алгоритма/ячейки сервис не предусмотрен. |
Функция GrdTransformEx позволяет зашифровать или расшифровать данные с помощью аппаратного алгоритма электронного ключа. Шифрование выполняется алгоритмом с числовым именем, заданным в параметре dwAlgoNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", то вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Длина буфера данных задаётся параметром dwLng. Для режимов ECB и CBC она должна быть кратна размеру блока алгоритма шифрования, в противном случае возвращается ошибка GrdE_InvalidArg. Для режимов CFB и OFB длина может быть произвольной, т.к. в этих режимах открытый или зашифрованный текст складываются по модулю 2 с ключевыми блоками полученными в результате работы операции блочного шифра. Открытый или зашифрованный текст должны находиться по адресу, указанному в параметре pData. Если функция выполнена успешно, то по этому адресу будут размещены зашифрованные или расшифрованные данные той же длины. В этом случае функция возвращает GrdE_OK.
В таких режимах шифрования, как CBC, CFB и OFB функции необходимо передать указатель на вектор инициализации pIV и длину вектора инициализации в параметре dwIVLng. После выполнения операции буфер, на который указывает pIV, будет содержать значение необходимое функции для повторного вызова. Длина вектора инициализации должна быть равна размеру блока алгоритма шифрования. Если длина окажется больше указанной величины, то лишние байты будут проигнорированы. Если длина окажется меньше указанной величины, то исходный буфер будет дополнен нулями. При вызове функции с нулевым указателем на вектор инициализации, ситуация равноценна использованию вектора инициализации состоящего из нулевых значений или вектора инициализации нулевой длины.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться. При выполнении операций шифрования и расшифрования следует использовать один и тот же вектор инициализации, если предполагается получить исходный открытый текст.
Скорость работы функции зависит от быстродействия электронного ключа и длины переданных данных. Следует заметить, что существует максимальная длина пакета. Данная величина означает количество данных, которые могут быть переданы в электронный ключ в одном пакете. Для достижения максимального быстродействия длина передаваемых функции данных должна быть кратна этой величине.
Если длина переданных данных превышает
Для алгоритмов GSII64
Размер блока алгоритма шифрования равен 8 байт. Максимальная длина пакета 248 байт.
Для алгоритмов AES128
Размер блока алгоритма шифрования равен 16 байт. Максимальная длина пакета 16384 байт.
Для алгоритмов ECC160
Для работы с аппаратными алгоритмами ECC160 используйте функцию GrdSign.
Для алгоритмов HASH64
Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHashEx.
public static GrdE GrdTransformEx(Handle grdHandle, GrdAlgNum algNum, byte[] data, GrdAM method, byte[] iv)
grdHandle [in]
Тип: Handle
хэндл, через который будет выполнена данная операция.
algNum [in]
Тип: GrdAlgNum
Номер аппаратного алгоритма, с помощью которого будет происходить шифрование.
data [in]
Тип: byte [ ]
Буфер данных для шифрования.
method [in]
Тип: GrdAM
Режим работы алгоритма и процесс шифрования.
iv [in]
Тип: byte [ ]
Вектор инициализации.
Алгоритм с указанным номером не существует. |
|
Ошибка CRC при выполнении алгоритма. Эта ошибка обычно возникает, если длина преобразуемой последовательности не совпадает с заданной во время создания алгоритма. |
|
Счетчик алгоритма достиг нулевого значения. Результат алгоритма больше нельзя получить. |
Метод GrdTransformEx позволяет шифровать данные с помощью аппаратного алгоритма ключа. Шифрование производится алгоритмом с числовым именем, заданным в параметре algNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться
Для алгоритмов GSII64
Длина массива преобразуемых данных (в байтах) 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
Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHash.
public static GrdE GrdTransformEx(Handle grdHandle, int algoNum, byte[] data, GrdAM method, byte[] iv)
grdHandle [in]
Тип: Handle
хэндл, через который будет выполнена данная операция.
algNum [in]
Тип: int
Номер аппаратного алгоритма, с помощью которого будет происходить шифрование.
data [in]
Тип: byte [ ]
Буфер данных для шифрования.
method [in]
Тип: GrdAM
Режим работы алгоритма и процесс шифрования.
iv [in]
Тип: byte [ ]
Вектор инициализации.
Алгоритм с указанным номером не существует. |
|
Ошибка CRC при выполнении алгоритма. Эта ошибка обычно возникает, если длина преобразуемой последовательности не совпадает с заданной во время создания алгоритма. |
|
Счетчик алгоритма достиг нулевого значения. Результат алгоритма больше нельзя получить. |
Метод GrdTransformEx позволяет шифровать данные с помощью аппаратного алгоритма ключа. Шифрование производится алгоритмом с числовым именем, заданным в параметре algNum. Этот алгоритм предварительно должен быть создан. Если в дескрипторе алгоритма установлен флаг "уменьшение счетчика", вычитание счетчика алгоритма происходит при каждом вызове GrdTransformEx.
Если шифрование выполнялось блоками произвольной длины, то для корректного расшифрования длина и порядок обработки блоков должны сохраняться
Для алгоритмов GSII64
Длина массива преобразуемых данных (в байтах) 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
Для работы с аппаратными алгоритмами HASH64 используйте функцию GrdHash.
- No labels