C_EncryptInit
, C_Encrypt
, C_EncryptUpdate
и C_EncryptFinal
¶Предупреждение
При шифровании с использованием механизма CKM_GOST28147
длина данных должна быть кратной 8 байт.
C_EncryptInit
(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)¶Параметры: |
|
---|
Инициализирует операцию зашифрования по ГОСТ 28147-89. Поддерживается как аппаратное, так и программное зашифрование.
Механизм зашифрования задаётся в поле mechanism
структуры CK_MECHANISM
. Для зашифрования библиотека
Cryptoki поддерживает механизмы, перечисленные ниже.
CKM_GOST28147
(0x00001221
) – механизм для симметричного шифра в режиме
ECB по стандарту ГОСТ 28147-89.CKM_GOST28147
(0x00001222
) – механизм для симметричного шифра в режиме CFB по
стандарту ГОСТ 28147-89.CKM_RSA_PKCS
(0x00000001
) – механизм для ассиметричного шифра RSA. Также используется для ЭП.CKM_RSA_PKCS_OAEP
(0x00000009
) – механизм для ассиметричного шифра RSA с использованием
OAEP.CKM_DES3_ECB
(0x00000132
) – механизм для симметричного шифра triple-DES в режиме ECB.CKM_DES3_CBC
(0x00000133
) – механизм для симметричного шифра triple-DES в режиме CBC.CKM_AES_ECB
(0x00001081
) – механизм для симметричного шифра AES
в режиме ECB.CKM_AES_CBC
(0x00001082
) – механизм для симметричного шифра AES в режиме CBC.Запускается в режимах
См.также
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
C_Encrypt
(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)¶Параметры: |
|
---|
Осуществляет единоразовое зашифрование, т.е зашифровывает только один блок данных. Шифрование выполняется по ГОСТ 28147-89.
Запускается в режимах
См.также
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
C_EncryptUpdate
(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen)¶Параметры: |
|
---|
Продолжает составную операцию зашифрования – зашифровывает очередной блок данных (по ГОСТ 28147-89).
Запускается в режимах
См.также
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
C_EncryptFinal
(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen)¶Параметры: |
|
---|
Завершает составную операцию зашифрования.
Запускается в режимах
См.также
Результат: |
Совет Полный список ошибок см. в приложении. |
---|
Для обеспечения успешного зашифрования данных, необходимо, чтобы функции в алгоритме были использованы в одной из следующих последовательностей:
Для единоразовой операции зашифрования | Для составной операции зашифрования |
---|---|
|
Пример реализации зашифрования на языке C:
// дескриптор сессионного ключа PKCS#11
CK_OBJECT_HANDLE pkcs11SessionKeyHandle;
// механизм шифрования ГОСТ 28147-89
CK_MECHANISM pkcs11EncMechanism;
// открытый текст
CK_BYTE plainText[8];
// длина открытого текста
CK_ULONG plainTextLength = sizeof(plainText);
// текст, зашифрованный PKCS#11
CK_BYTE pkcs11EncText[8];
// длина текста, зашифрованного PKCS#11
CK_ULONG pkcs11EncTextLength = sizeof(pkcs11EncText);
// инициализационный вектор для шифрования
CK_BYTE encIV[8];
// устанавливаем механизм шифрования по ГОСТ 28147-89
pkcs11EncMechanism.mechanism = CKM_GOST28147;
pkcs11EncMechanism.pParameter = encIV;
pkcs11EncMechanism.ulParameterLen = sizeof(encIV);
// инициализируем операцию зашифрования
rv = C_EncryptInit(pkcs11SessionHandle, &pkcs11EncMechanism, pkcs11SessionKeyHandle);
if(rv != CKR_OK)
{
throw runtime_error("C_EncryptInit failed.");
}
// зашифровываем открытый текст
rv = C_Encrypt(pkcs11SessionHandle, plainText, plainTextLength, pkcs11EncText, &pkcs11EncTextLength);
if(rv != CKR_OK)
{
throw runtime_error("C_EncryptInit failed.");
}
Пример зашифрования для ОС Android на языке Java:
// дескриптор сессии
LongRef session = new LongRef();
// дескриптор сессионного ключа
LongRef sessionKeyHandle = new LongRef();
// механизм для шифрования данных
CKM encryptionMech = new CKM(CKM.GOST28147, null);
// шифруемое сообщение
byte[] plainData = new byte[32];
// зашифрованное сообщение
byte[] encryptedData = new byte[32];
// длинна сообщений
LongRef dataLength = new LongRef(encryptedData.length);
// инициализация шифрования
rv = C.EncryptInit(session.value, encryptionMech, sessionKeyHandle.value);
if(rv != CKR.OK)
{
throw new CKRException("C.EncryptInit", rv);
}
// шифрование
rv = C.Encrypt(session.value, plainData, encryptedData, dataLength);
if(rv != CKR.OK)
{
throw new CKRException("C.Encrypt", rv);
}