Поделиться через


BLOB-объекты закрытого ключа DSS версии 3

При экспорте закрытого ключа DSS версии 3 он находится в следующем формате:

BLOBHEADER        blobheader; 
DSSPRIVKEY_VER3   dssprivkeyver3;
BYTE p[dssprivkeyver3.bitlenP/8]; 
                    // Where P is the prime modulus
BYTE q[dssprivkeyver3.bitlenQ/8]; 
                    // Where Q is a large factor of P-1
BYTE g[dssprivkeyver3.bitlenP/8]; 
                    // Where G is the generator parameter
BYTE j[dssprivkeyver3.bitlenJ/8]; 
                    // Where J is (P-1)/Q
BYTE y[dssprivkeyver3.bitlenP/8]; 
                    // Where Y is (G^X) mod P
BYTE x[dssprivkeyver3.bitlenX/8]; 
                    // Where X is the private exponent

Этот формат BLOB экспортируется при использовании флага CRYPT_BLOB_VER3 с CryptExportKey. Так как версия находится в BLOB-объекте, при использовании этого BLOB-объекта с CryptImportKey не требуется указывать флаг.

В следующей таблице описывается каждый компонент ключевого BLOB-объекта.

Поле Description
Blobheader Структура BLOBHEADER. Элемент bType должен иметь значение PUBLICKEYBLOB.
Dssprivkeyver3 Структура DSSPRIVKEY_VER3 . Для закрытых ключей необходимо задать значение "DSS4" (0x34535344). Обратите внимание, что шестнадцатеричное значение является просто кодировкой ASCII "DSS4".
P Значение P находится непосредственно после структуры DSSPRIVKEY_VER3 и всегда должно быть длиной в байтах поля DSSPRIVKEY_VER3 bitlenP (битовая длина P), разделенного на восемь (маленький формат).
К Значение Q находится непосредственно после значения P и всегда должно быть длиной в байтах поля DSSPRIVKEY_VER3 bitlenQ , разделенным на восемь (маленький формат).
G Значение G находится непосредственно после значения Q и всегда должно быть длиной в байтах поля DSSPRIVKEY_VER3 bitlenP (битовая длина P), разделенного на восемь. Если длина данных составляет один или несколько байтов, чем P, разделенных на 8, данные должны быть заполнены необходимыми байтами (нулевое значение), чтобы сделать данные требуемой длиной (маленький формат).
J Значение J находится непосредственно после значения G и всегда должно быть длиной в байтах поля DSSPRIVKEY_VER3 bitlenJ , разделенным на восемь (маленький формат). Если значение bitlenJ равно 0, то значение отсутствует в BLOB-объекте.
Y Значение Y (G^X) mod P находится непосредственно после значения J и всегда должно быть длиной в байтах поля DSSPRIVKEY_VER3 bitlenP (битовая длина P), разделенного на восемь. Если длина данных, полученных от вычисления мода G^X, составляет один или несколько байтов, чем P, разделенных на 8, данные должны быть заполнены необходимыми байтами (нулевого значения), чтобы сделать данные требуемой длиной (маленький формат).
X Значение X является случайным большим целым числом, таким образом, что общедоступная часть пары ключей DH, Y, равна: Y = (G^X) mod P

 

При вызове CryptExportKey разработчик может выбрать, следует ли шифровать ключ. Ключ шифруется, если параметр hExpKey содержит допустимый дескриптор для ключа сеанса. Все, кроме части BLOBHEADER , шифруется. Обратите внимание, что алгоритм шифрования и параметры ключа шифрования не хранятся вместе с BLOB-объектом закрытого ключа. Приложение должно управлять и хранить эти сведения. Если нуль передается для hExpKey, закрытый ключ будет экспортирован без шифрования.

Внимание

Это опасно для экспорта закрытых ключей без шифрования, так как они затем уязвимы для перехвата и использования несанкционированными сущностями.