Podpisovanje in preverjanje podatkov
Podpisujete zaporedja bajtov, na primer podatke računov ali sporočila lastnega protokola, in podpis preverite na nasprotni strani – kot sestavljeni podpis ML-DSA iz RSA ali ECDSA skupaj z ML-DSA ali kot čisti podpis ML-DSA.
Pregled rešitve
| Element | Namen |
|---|---|
RSA.SignData, ECDsa.SignData s CryptoMode.Hybrid | sestavljeni podpis ML-DSA |
RSA.VerifyData, ECDsa.VerifyData s CryptoMode.Hybrid | preveri oba dela sestavljenega podpisa |
SignatureExtensions.SetTransientPqKey | določi par ključev ML-DSA za trenutno nit |
SignatureExtensions.SetTransientPqPublicKey | določi javni ključ ML-DSA za preverjanje |
SignatureExtensions.ClearTransientPqKey | odstrani ključe niti in prepiše zasebni ključ |
MLDsaKey.SignData, MLDsaKey.VerifyData | čisti podpis ML-DSA |
Izvedba
Sestavljeni podpis z RSA-3072 in ML-DSA-65:
byte[] data = "Račun 2026-0042"u8.ToArray(); using var rsa = RSA.Create(3072); using var pqKey = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65); SignatureExtensions.SetTransientPqKey(pqKey.ExportSubjectPublicKeyInfo(), pqKey.ExportPkcs8PrivateKey()); byte[] signature; try { signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); } finally { SignatureExtensions.ClearTransientPqKey(); }
Preverjanje na nasprotni strani, ki pozna javni ključ RSA in javni ključ ML-DSA:
SignatureExtensions.SetTransientPqPublicKey(pqKey.ExportSubjectPublicKeyInfo()); try { bool valid = rsa.VerifyData( data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); Console.WriteLine(valid); } finally { SignatureExtensions.ClearTransientPqKey(); }
Čisti podpis ML-DSA:
byte[] pqSignature = pqKey.SignData(data); Console.WriteLine(pqKey.VerifyData(data, pqSignature));
Opombe
- Samo pari iz osnutka. Sestavljeni ML-DSA pozna fiksne kombinacije nabora parametrov, klasičnega ključa in zgoščevalnega postopka, na primer ML-DSA-65 z RSA-3072 ali RSA-4096 in ML-DSA-65 z ECDSA P-256 ali P-384. Drug par, na primer ML-DSA-65 z RSA-2048, knjižnica zavrne s
CryptographicException, ki par navede. Seznam je v Oblike postkvantnih delov. - En ključ na nit. Ključi iz
SetTransientPqKeyveljajo samo za nit, ki jih nastavi. V asinhroni kodi jih nastavite tik pred klicem, brez vmesnegaawait, in jih v isti niti znova odstranite. Če ključ manjka,SignDatasprožiCryptographicException. ClearTransientPqKeyprepiše vašo tabelo. Knjižnica zasebnega ključa ne kopira.ClearTransientPqKeypodano tabelo zapolni z ničlami. Zato podajte kopijo, ki je pozneje ne potrebujete več, kot v primeru rezultatExportPkcs8PrivateKey.- .NET sestavljenega podpisa ne preveri.
rsa.VerifyDatabrezCryptoModeza sestavljeni podpis vrnefalse, ker ni čisti podpis RSA. Sestavljene podpise zato izmenjujte samo z nasprotnimi stranmi, ki preverjajo sestavljeni ML-DSA. - Velikost. Sestavljeni podpis iz ML-DSA-65 in RSA-3072 je dolg 3693 bajtov, čisti podpis ML-DSA-65 pa 3309 bajtov. Temu prilagodite polja v podatkovni zbirki in okvirje protokola.
Sorodne teme
sl/wiki/pqcrypt/lib/how-to/sign-and-verify-data.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille