I'm looking to build my own digital signature operations into a program I'm writing, and the nuances of cryptography are a bit beyond me.
Bandiera rossa! non implementare mai la crittografia da solo. Mai. Mai mai mai . Anche se stai usando algoritmi standard e collaudati, non dovresti mai essere quello che li mette tutti insieme. A meno che tu non abbia una conoscenza approfondita della crittografia, non tentare di implementarla tu stesso! Usa una libreria che lo allontani, come libsodium. Non implementare la crittografia da soli!
What are my options and best choices?
Se nessuno degli algoritmi elencati come sicuri sul sito di Daniel Bernstein è supportato dal sistema che stai usando, non c'è nulla che tu possa fare a meno di tirare in una libreria con supporto o implementando la curva da solo. Tuttavia, una breve ricerca mostra un documento che afferma che Windows supporta Curve25519, una curva sicura progettata dal creatore del sito web che hai collegato.
Does P-521 correct the deficiencies of the others?
No. P-521 è simile alle altre curve NIST in quanto utilizzano una costante di origine sconosciuta. Perché è più grande, pretende di offrire più sicurezza rispetto alle altre, piccole curve. Nota che le "deficienze" che fai notare sono altamente teoriche. La preoccupazione è che la costante era scelta intenzionalmente per indebolire la curva. Poiché la costante è stata generata da SHA-1, un punto debole dovrebbe indicare che un sottogruppo molto ampio di possibili curve è vulnerabile e che il NIST, attraverso l'NSA, lo sapeva. Questo è possibile, ma improbabile. Le probabilità sono, le curve NIST sono perfettamente perfette .
Is implementing a curve as simple as turning the math formula into a function?
Non sono sicuro di come esattamente questo può essere fatto in .NET Core. Tuttavia, vedo una domanda su Stack Overflow che indica che è effettivamente possibile. Non so nulla oltre a questo.
Am I better off sticking with RSA?
Dipende dal tuo caso d'uso. Se lo stai usando per lo scambio di chiavi, non dovresti usare RSA. Il motivo è che RSA non fornisce il segreto in avanti, mentre la CEC (anche le curve NIST) lo fa. Se si utilizza l'algoritmo in una firma digitale (come indicato), sarebbe invece preferibile ricorrere a RSA. Ma ancora, dovresti non implementare la tua crittografia!