Я пишу приложение, в котором необходимы как шифрование/дешифрование, так и подпись/проверка, и я выбираю X25519 в качестве алгоритма согласования ключей, который будет создавать ключ для шифрования, и ECDSA для подписи сообщений.
Генерация ключа: я генерирую закрытый ключ curve25519 из мнемоники (поэтому у меня есть случайный 32-байтовый закрытый ключ).
Теперь у меня есть массив 32 байта, я хочу использовать этот массив байтов массива как для шифрования, так и для подписи, проблема, которая у меня есть, для X25519 мне нужно применить зажим ключа, чтобы этот закрытый ключ был действительным, что выглядит так:
закрытый ключ[0] &= 248; // сбрасываем 3 младших бита
privateKey[31] &= 127 // сбросить старший бит
privateKey[31] |= 64 // устанавливаем второй старший бит
Но для ECDSA ключ должен быть в диапазоне $[1, Н]$, где N (для кривой 25519) равно $2^{252}$ + небольшой фактор, и поэтому мне нужно преобразовать мой 32-байтовый массив в число, которое подходит для этого диапазона.
У меня есть несколько вопросов:
- Почему закрытый ключ X25519 не должен соответствовать диапазону $[1, Н]$?
- Кроме того, почему не важно применить функцию фиксации ключа, используемую в X25519, к ключу, используемому для ECDSA?