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


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

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

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

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

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

Поле Description
Blobheader Структура BLOBHEADER.
dhprivkeyver3 Структура DHPRIVKEY_VER3 . Волшебный элемент должен быть установлен на 0x34484400 для закрытых ключей. Обратите внимание, что шестнадцатеричное значение — это просто кодировка ASCII dH4.
P Значение P находится непосредственно после структуры DHPRIVKEY_VER3 и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3 bitlenP (битовая длина P), разделенного на восемь (маленький формат).
К Значение Q находится непосредственно после значения P и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3 bitlenQ, разделенным на восемь (маленький формат). Если значение bitlenQ равно 0, то значение отсутствует в BLOB-объекте.
G Значение G находится непосредственно после значения Q и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3 битленP (битовая длина P), разделенного на восемь. Если длина данных составляет один или несколько байтов, чем P, разделенных на 8, данные должны быть заполнены необходимыми байтами (нулевое значение), чтобы сделать данные требуемой длиной (маленький формат).
J Значение J находится непосредственно после значения G и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3 bitlenJ, разделенным на восемь (маленький формат). Если значение bitlenJ равно 0, то значение отсутствует в BLOB-объекте.
Y Значение Y (G^X) mod P находится непосредственно после значения J и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3 bitlenP (битовая длина P), разделенного на восемь. Если длина данных, полученных от вычисления мода G^X, составляет один или несколько байтов, чем P, разделенных на 8, данные должны быть заполнены необходимыми байтами (нулевого значения), чтобы сделать данные требуемой длиной (маленький формат).
X Значение X является случайным большим целым числом, таким образом, что общедоступная часть пары ключей DH, Y, равна: Y = (G^X) mod P

 

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

Примечание.

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