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


Diffie-Hellman версии 3 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

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

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

Поле Описание
blobheader Структура BLOBHEADER .
dhprivkeyver3 Структура DHPRIVKEY_VER3 . Магический элемент должен иметь значение 0x34484400 для закрытых ключей. Обратите внимание, что шестнадцатеричное значение является просто кодировкой ASCII "DH4".
P Значение P расположено непосредственно после структуры DHPRIVKEY_VER3 и всегда должно быть длиной в байтах поля bitlenPDHPRIVKEY_VER3 (длина бита P), разделенной на восемь (формат с маленьким байтом).
Q Значение Q расположено непосредственно после значения P и всегда должно быть длиной в байтах поляbitlenQ DHPRIVKEY_VER3, разделенным на восемь (формат с маленьким байтом ). Если значение bitlenQ равно 0, это значение отсутствует в большом двоичном объекте.
G Значение G находится непосредственно после значения Q и всегда должно быть длиной в байтах поля bitlenPDHPRIVKEY_VER3 (битовая длина P), деля его на восемь. Если длина данных составляет один или несколько байтов меньше P, разделенных на 8, данные должны быть заполнены необходимыми байтами (с нулевым значением), чтобы сделать данные требуемой длины (формат с маленьким байтом ).
J Значение J находится непосредственно после значения G и всегда должно быть длиной в байтах поляbitlenJ DHPRIVKEY_VER3, разделенным на восемь (формат с маленьким байтом ). Если значение bitlenJ равно 0, то значение отсутствует в большом двоичном объекте.
Да Значение Y (G^X) mod P расположено непосредственно после значения J и всегда должно быть длиной в байтах поля DHPRIVKEY_VER3bitlenP (длина бита P), делящемуся на восемь. Если длина данных, полученных в результате вычисления (G^X) mod P, на один или несколько байтов короче P, разделенных на 8, данные должны быть заполнены необходимыми байтами (с нулевым значением), чтобы сделать данные требуемой длины (формат с маленьким байтом ).
X Значение X является случайным большим целым числом, таким образом, что открытая часть пары ключей DH, Y, равна: Y = (G^X) mod P

 

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

Примечание

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