Come posso verificare una firma DSA in C#?Verificare una firma DSA in C# che utilizza il formato ASN.1 codificato BER/DER
Data:
- il testo del messaggio,
- un digest firmato (in genere ASN.1 formato DER),
- la chiave pubblica (in un certificato X.509 firmato, PEM o DER formato)
ho provato una serie di approcci, ma non hanno avuto alcun successo:
OpenSSL.NET: vari errori strani con la libreria; Ho uno open thread running with the author over on SourceForge ma non sono ancora riuscito a risolverlo.
API Microsoft .NET: Impossibile decomprimere la firma DER per il confronto. Una firma DSA è 40 byte (due interi a 20 byte), ma viene presentata come una sequenza codificata DER di due numeri interi, quindi la lunghezza totale può variare da 46 a 48 byte (vedere this post per una rapida panoramica.) While .NET include il codice per analizzare ASN.1/DER (perché può leggere i certificati in formato DER), è sepolto in profondità e non c'è modo di accedervi in modo da poter recuperare correttamente i 40 byte dal sig codificato ASN.1/DER. Questo problema mi ha portato alla successiva opzione ...
BouncyCastle: attraverso l'uso delle funzioni
Org.BouncyCastle.Asn1
, posso analizzare la firma ASN.1 e tirarlo in esso è componente valori interi S R e. Ma quando li passo alle routine di verifica della firma, non funziona senza alcuna spiegazione fornita. Non sono sicuro se sto facendo qualcosa di sbagliato, perché il C# API è completamente privi di documenti, e la versione di Java è a malapena documentato (ma non c'è alcun esempio o HOWTO informazioni che posso trovare.)
Mi sono lanciato questo problema per circa una settimana. So che qualcuno deve averlo fatto prima, ma non ho trovato nessun esempio completo/funzionante.
Ho tre progetti C# qui seduti, ciascuno completo al 95% ma con un difetto critico che causa il fallimento. Qualsiasi codice di esempio funzionante sarebbe enormemente apprezzato.
modifica: ecco un esempio di firma che sto cercando di verificare, convertito in Base64 e hex ASCII per renderlo postabile. Questa in particolare è di 47 byte, ma un parser corretta deve ancora accettare, leggere sulle specifiche DER per maggiori informazioni (BER/DER aggiunge un importante 00 per confermare il segno se il MSB è 1)
Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=
ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
Struttura è secondo le specifiche DER; analizza come segue:
30 2d: sequence, length 45 (may vary from 44 to 46)
02 15: integer, length 21 (first byte is 00 to confirm sign)
009482ad831075b3a773b89ce768dfc983bbc992b7
02 14: integer, length 20 (leading 00 not necessary for this one)
69d6666e29fb06f5f1a5ea0987b761aae0f60933
scrivere il mio parser DER è davvero non è un'opzione, troppo spazio per l'errore e ci deve essere un modo per farlo correttamente.
Mi chiedevo se potevi farmi un favore e cambiare il titolo da "Verifica firma DSA in C#" a "Verifica firma DSA in C# con formato ASN.1" o qualcosa del genere. Potrebbe aiutare a cercare un po 'le persone. – Greg
Proprio come un commento; Sto andando nella direzione opposta (verifica una firma in Java creata in .NET); Ho dovuto scrivere un convertitore dal formato .NET DSA (che è solo r ||s in 40 byte) nel formato DER. Secondo quanto ho trovato qui (http://www.mombu.com/microsoft/security-crypto/t-dsa-signature-format-674106.html) il formato DER si aspetta che r e s siano big-endian ma ciò non ha Non lavoro affatto, quindi l'ho lasciato come little-endian e funziona ... Non ho trovato nulla di molto chiaro su questo; dovrebbe essere grande o piccolo -endiano ... se qualcuno lo sa, per favore suonate! – SonarJetLens