Если я сгенерирую закрытый и открытый ключ для DSA, используя Crypto ++:
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, и открытый ключ намного меньше закрытого.
Итак … легкомысленно, потому что арифметика по модулю не моя сильная сторона …
Источник моей информации здесь:
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 должно быть меньше или равно длине вывода хеша.
(поэтому длина q равна N битам — скажем, 256 для 3072-битного ключа)
Выберите L-разрядный простой модуль p такой, что p – 1 кратно q.
Выберите g — число, порядок умножения которого по модулю p равен q. Это может быть сделано путем установки g = h (p – 1) / q mod p для некоторого произвольного h (1 < час < p − 1) и повторная попытка с другим h, если результат получится равным 1. Большинство вариантов выбора h приведут к пригодному g; обычно h = 2 используется.
(поэтому p будет иметь длину 3072 бита)
Параметры алгоритма (p, q, g) могут совместно использоваться разными пользователями системы.
Пользовательские ключи
Учитывая набор параметров, вторая фаза вычисляет закрытые и открытые ключи для одного пользователя:
Выберите x некоторым случайным методом, где 0 < Икс < кв.
Рассчитайте y = gx mod p.Открытый ключ (p, q, g, y).
открытый ключ содержит p, поэтому он должен быть длиной не менее 3072 бит
Закрытый ключ — это х.
поскольку x зависит от q, он будет иметь (в нашем случае) 256 битов — это длина закрытого ключа.
Это кажется разумным?
Других решений пока нет …