2015-10-28 4 views
0

Если я произвожу частный и публичный ключ для DSA, используя Crypto ++:DSA публичный ключ больше, чем закрытый ключ

CryptoPP::AutoSeededRandomPool rng; 

CryptoPP::DSA::PrivateKey privateKey; 

privateKey.GenerateRandomWithKeySize(rng, 2048); 

CryptoPP::DSA::PublicKey publicKey; 

privateKey.MakePublicKey(publicKey); 

Когда я зашифровать приватный ключ, как так:

CryptoPP::ByteQueue privateKeyQueue; 
key.DEREncodePrivateKey(privateKeyQueue); 

Затем информация толкаемых в очередь для приватного ключа меньше закодированных данных для открытого ключа:

CryptoPP::ByteQueue publicKeyQueue; 
key.DEREncodePublicKey(publicKeyQueue); 

это ожидат и это правильный способ генерировать мой открытый ключ, который будет передан другим?

Я работаю только с RSA раньше, а открытый ключ намного меньше, чем закрытый ключ.

ответ

1

Итак ... ступая легко, потому что по модулю арифметика не мой конек ...

Источник моей информации здесь:

https://en.wikipedia.org/wiki/Digital_Signature_Algorithm

Выберите утвержденную криптографической хэш-функции H . В исходном DSS H всегда был SHA-1, но более сильные хэш-функции SHA-2 одобрены для использования в текущей DSS. [5] [9] Выход хеша может быть усечен до размера пары ключей.

Определите длину ключа L и N. Это основной показатель криптографической силы ключа. Исходный DSS ограничил L, чтобы быть кратным 64 между 512 и 1024 (включительно). NIST 800-57 рекомендует длину 2048 (или 3072) для ключей со сроками службы безопасности, выходящими за пределы 2010 года (или 2030), используя соответственно более длинную N. [10] В FIPS 186-3 указаны пары длины L и N (1024 160), (2048, 224), (2048, 256) и (3072,256).

Выберите N-разрядное простое q. N должно быть меньше или равно выходной длине хеша.

(так д является N битов длиной - скажем, 256 для 3072-битного ключа)

Выберите L-битовую по простому модулю р, что р-1 является кратным ц. Выберем g, число, мультипликативный порядок которого по модулю p равен q. Это можно сделать, установив g = h (p-1)/q mod p для некоторого произвольного h (1 < h < p-1) и повторить попытку с другим h, если результат получится как 1. Большинство вариантов h приведет к использованию g; обычно h = 2.

(так р будет 3072 бит в длину)

Параметры алгоритма (р, д, г) могут быть разделены между различными пользователями системы.

каждого пользователя ключи

Учитывая набор параметров, вторая фаза вычисляет закрытые и открытые ключи для одного пользователя:

Выбрать х некоторым случайным методом, где 0 < х < д , Вычислить y = gx mod p.

Открытый ключ (p, q, g, y).

открытого ключа имеет р в нем - поэтому он должен быть длиной не менее 3072 бит

Закрытый ключ является х.

поскольку x зависит от q, он будет иметь (в нашем случае) 256 бит - это длина закрытого ключа.

Это кажется разумным?

+0

Да, это кажется разумным. Учитывая ваше наблюдение за длиной битов p и q, я бы пошел дальше и утверждать, что длина (y)> length (x) является ответом, если он вычислен по модулю p, и учитывая, что p, q, g, вероятно, необходимы для обоих подписания и проверки. – keith