Domanda:
Comprensione delle chiavi estratte dall'hardware
swx
2013-10-20 21:24:24 UTC
view on stackexchange narkive permalink

Sono un principiante delle criptovalute, ma ho lavorato su sistemi di accesso alle carte che crittografano i dati della carta con RSA a 128 bit.

Ho un esempio (da una carta) di 1024 bit di dati crittografati Ho anche la chiave pubblica (1024 bit), che è (piuttosto curiosamente) inserita nell'hardware di controllo degli accessi. Sono sicuro al 100% che sia una chiave pubblica (non privata).

I primi tentativi con l'utilizzo della chiave con OpenSSL con la chiave binaria falliscono:

 ➤ openssl rsautl -decrypt - in ptt.enc.key -inkey ptt.pub.key -out ptt.dec.hexunable to load Private Key➤ 11636: errore: 0906D06C: routine PEM: PEM_read_bio: no start line: pem_lib.c: 648: Expecting: ANY PRIVATE KEY 

Sono consapevole che probabilmente ho bisogno di formattare / preparare la chiave, ma non sono sicuro di come.

Qualche idea?

Modifica Per quello che vale: la chiave pubblica è:

 15 77 D0 29 87 C6 3A 95 B5 1A E1 49 43 08 34 AE AF 3F 2E 0F 4C F8 C6 88 7A C6 C8 D7 32 D7 94 82 60 4F C1 8D A7 7A 9C C1 F5 4D 80 63 EA E6 E4 2A 41 B2 E0 4D 16 63 85 6D 76 0E AB EC CF B7 83 BA E1 D4 3E 1E 02 C5 01 1E 82 3B 24 F2 91 8F 98 A4 96 2A 87 5D 0D F9 4F 80 98 A1 A3 0D C9 41 30 3F 98 AB A1 9E 6F 99 65 97 ED AD 7F 03 CA B9 15 ED 4B 58 B7 BA AD 28 C0 B6 75 93 CD FC CB 53 99 AB 

Il valore di una carta crittografata è:

 8F 04 8D E0 83 7F 29 C8 03 54 D1 B5 E3 03 27 4E 3F C5 8D 79 75 D6 A1 FE 3B 67 F1 43 99 65 CC EE B1 A8 55 BA E8 3D A7 81 75 FD 2E 86 B3 A6 C8 A0 4E 0D 77 1E C3 C0 AE 27 DA 06 3D 8F A5 CC E0 32 3D 65 60 E9 86 A2 65 E2 BB D3 B9 37 4E A6 BF 91 89 02 C5 26 E0 AF FD A8 82 23 68 38 4E 26 51 44 52 D9 B6 CA 6E 84 0A 9D 6C FA BE 85 D3 22 DF 57 61 B9 A8 21 0B A4 6D 89 12 4A 64 25 83 12 60 3D 

La protezione generale funziona in questo modo: i servizi esterni possono avere accesso agli edifici, ma ciascuno l'accesso individuale è limitato nel tempo, per prevenire abusi. Le carte devono essere aggiornate ogni giorno circa.

Secondo la documentazione del sistema:

"L'accesso all'edificio viene controllato aggiungendo la chiave pubblica dei servizi al dispositivo dell'edificio"

And:

"Il" dispositivo di ricarica "di un servizio che utilizza la crittografia RSA utilizzando chiavi private 768 o 1024 bit consente l'emissione di badge agli utenti su base giornaliera"

Sono d'accordo - questo sembra essere l'inverso di un sistema a chiave asincrona (che distribuisce la chiave pubblica e quindi utilizza la chiave privata per la crittografia) - quindi forse stanno facendo qualcosa di diverso (firma RSA?) - questo . è quello che sto cercando di determinare

Ciò è confermato all'interno del codice hardware che sto vedendo:

$ pubkey = "x3135373744303239383743363341393542353141453134393433303833344145414633463245304634434638433638383741433643384437333244373934383236303446433138444137374139434331463534443830363345414536453432413431423245303444313636333835364437363045414245434346423738334241453144343345314530324335303131453832334232344632393138463938413439363241383735443044463934463830393841314133304443393431333033463938414241313945364639393635393745444144374630334341423931354544344235384237424 1414432384330423637353933434446434342353339394142 "

Speriamo che questa modifica fornisca un po 'di chiarezza sull'intera situazione - Apprezzo la tua comprensione e l'assistenza.

Come fai a sapere che è a 128 bit? La chiave pubblica che hai elencato ha 128 ** byte **, ovvero 1024 bit.
Hai completamente ragione - ho detto che sono un noob delle criptovalute. Quindi sono 1024 bit :)
Come indicato da mikeazo, $ \; $ "128-bit" $ \ mapsto $ "1024-bit" $ \: \: $. $ \; \; \; \; \; $
Non solo questo è fuori tema, ma è sbagliato per molte ragioni: non si può decifrare con una chiave pubblica; non viene fornito l'esponente pubblico; la chiave pubblica è espressa come una stringa di 128 byte, ma non è un modulo pubblico valido se preso big-endian, perché sarebbe un intero a 1021 bit divisibile per 2631907 (potrebbe essere corretto se preso little-endian).
@fgrieu - grazie ancora. Ho aggiornato il post originale per avere più dettagli e contesto per forse aiutare a svelare cosa sta succedendo.
La tua domanda potrebbe essere migliore su ReverseEngineering.SE in quanto riguarda più il reverse engineering che la teoria della crittografia. Posso migrarlo lì se lo desideri.
Ciao @mikeazo - Potrebbe essere un buon posto. Pensi che il post si sia evoluto abbastanza da poterci fare un nuovo post?
Una risposta:
Ilmari Karonen
2013-10-20 23:10:53 UTC
view on stackexchange narkive permalink

Una chiave pubblica RSA consiste di due cose: il modulo m (un prodotto di due grandi numeri primi p e q ) e l'esponente pubblico e (un numero piccolo e spesso fisso, comunemente 3 o 65537).

Una chiave privata RSA è costituita dallo stesso modulo m come nella chiave pubblica e nell'esponente privato d , un numero scelto in modo tale che xed x (mod m ). In genere, d avrà all'incirca le stesse dimensioni di m o leggermente più corto. (In alternativa è possibile invece memorizzare i numeri primi p e q , da cui, insieme a e , il modulo m e l'esponente privato d può essere calcolato.)

Ad ogni modo, il tuo numero a 1024 bit sembra che potrebbe essere il modulo (sebbene, se è così, certamente non dovrebbe avere piccoli fattori). Sei sicuro che non ci sia un altro numero memorizzato nell'hardware che potrebbe essere l'esponente privato?

Inoltre, sei sicuro che il dispositivo stia effettivamente eseguendo la crittografia RSA e non, diciamo, firma RSA, che superficialmente sembra "crittografare con la chiave privata" (sebbene i dettagli degli schemi di riempimento necessari per rendere sicure le due operazioni differiscano notevolmente)? ​​


Modifica: il mio francese è un po 'arrugginito, ma sulla base delle informazioni extra che hai fornito e di ciò che ho potuto raccogliere a colpo d'occhio dal sito Vigik, sembra che cosa stiano facendo è probabilmente qualcosa del genere:

  • Il servizio di ricarica detiene la chiave privata, mentre il dispositivo di controllo accessi ha la chiave pubblica corrispondente. La carta probabilmente non contiene nessuna delle chiavi e può o non può effettivamente fare alcuna crittografia.

  • Quando la carta viene caricata, il servizio di addebito crea un messaggio in cui si afferma che questa particolare carta è autorizzata ad accedere a determinate posizioni fino a un determinato momento. Quindi firma questo messaggio utilizzando la chiave privata e invia il messaggio firmato alla carta.

  • Quando la carta viene utilizzata per richiedere l'accesso, trasmette il messaggio firmato al controllo accessi dispositivo, che verifica che l'autorizzazione sia valida per la posizione, non è scaduta e che la firma è corretta.

Almeno, questo è più o meno il modo in cui Io progetterei un sistema come questo. Un vantaggio di questo design è che né la carta né il dispositivo di controllo accessi devono conoscere la chiave privata, quindi non può essere compromessa anche se uno dei due viene rubato e analizzato. (Il servizio di ricarica ha bisogno della chiave privata, ma presumibilmente può essere protetto meglio delle carte e dei dispositivi di controllo degli accessi, possibilmente anche effettuando la firma effettiva su un server remoto.) Inoltre, non richiede la carta stessa per farlo. crypto, il che li rende molto più facili ed economici da implementare.

(In realtà, però, se stessi progettando un tale sistema e avessi una scheda che potrebbe fare la firma RSA, darei anche a ciascuna carta la propria chiave privata, includere la chiave pubblica corrispondente nel messaggio di autorizzazione e fare in modo che il dispositivo di controllo accessi richieda una prova a conoscenza zero che la carta conosce davvero la chiave privata a cui dichiara hanno. Ciò renderebbe le carte davvero non clonabili, anche temporaneamente, senza un serio sforzo di reverse engineering per estrarre la chiave.)

Ehi, grazie per la risposta. Secondo l'articolo di wikipedia (e confermato da ciò che vedo nel codice): http://fr.wikipedia.org/wiki/Vigik> Un "dispositivo di ricarica" ​​di un servizio che utilizza la crittografia RSA utilizzando chiavi private a 768 o 1024 bit ** ** consente il rilascio di badge agli utenti.> L'accesso all'edificio è controllato aggiungendo la ** chiave pubblica ** dei servizi al sistema. Non sono sicuro che si tratti di crittografia o firma: c'è un modo per dirlo? sono sicuro che quello che ho qui è la chiave pubblica.
Sulla base delle informazioni extra che hai fornito, sembra che probabilmente stiano facendo la firma RSA. (Il fatto che lo stiano facendo _correttamente_ è un'altra questione, ovviamente.) In particolare, sembra probabile che la carta contenga la chiave privata o (più probabilmente) solo un token pre-firmato emesso dal servizio di addebito, che il il dispositivo di controllo dell'accesso verifica quindi utilizzando la chiave pubblica.
Grazie mille per gli aggiornamenti @Ilmari Karonen! Quindi, in teoria, se ho la chiave pubblica (dall'unità di controllo degli accessi) e la firma a 1024 bit sulla carta, dovrei, in teoria, essere in grado di verificare la firma della carta con la chiave pubblica, il che dimostrerebbe la tua teoria? In questo caso, immagino che tutto arrivi al punto di partenza: come potrei farlo esattamente? Grazie ancora.
Non hai ancora l'esponente pubblico per quanto ne sappiamo, giusto?
Secondo tutta la documentazione e ciò che ho visto nel codice sorgente, la chiave pubblica si trova sul dispositivo di controllo degli accessi - e questa è la chiave che ho (pubblicata come $ pubkey sopra).
@swx: Quello che hai è _probabilmente_ il modulo. (Potrebbe essere il modulo e l'esponente pubblico codificato in qualche modo in una singola stringa di bit, ma ne dubito.) L'esponente pubblico potrebbe essere codificato nell'implementazione RSA; se non riesci a trovare qualcosa che assomigli a uno, ti suggerirei di provare i valori più comuni (65537 = 0x10001 e 3). Dovrai anche capire come viene codificato il modulo; potrebbe essere big- o little-endian o qualche divertente formato mixed-endian, o potrebbe essere qualcosa come BER. Puoi verificare provando a fattorizzarlo: un modulo RSA valido non dovrebbe avere piccoli fattori.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...