Scriu o aplicație în care sunt necesare atât criptarea/decriptarea, cât și semnarea/verificarea și aleg X25519 ca algoritm de acord de cheie care va produce o cheie pentru criptare și ECDSA pentru a semna mesajele.
Generare cheie: generez o cheie privată curve25519 dintr-un mnemonic (deci am un fel de cheie privată aleatorie de 32 de octeți).
Acum am o matrice de 32 de octeți, vreau să folosesc această matrice de octeți atât pentru criptare, cât și pentru semnare, problema pe care o am este că pentru X25519 trebuie să aplic blocarea cheii pentru ca această cheie privată să fie validă, ceea ce arată astfel:
privateKey[0] &= 248; // dezactivați cei 3 biți cei mai puțin semnificativi
privateKey[31] &= 127 // anulează cel mai semnificativ bit
privateKey[31] |= 64 // setează al doilea bit cel mai semnificativ
Dar pentru ECDSA, cheia trebuie să fie în gamă $[1, N]$, unde N (pentru curba25519) este egal cu $2^{252}$ + un factor mic, așa că trebuie să-mi convertesc matricea de 32 de octeți într-un număr care se încadrează în acest interval.
Am câteva întrebări:
- De ce nu este necesar ca cheia privată X25519 să se încadreze în gamă $[1, N]$?
- De asemenea, de ce nu este important să aplicați funcția de prindere a cheii utilizată în X25519 la cheia utilizată pentru ECDSA?