Come si può sapere quale algoritmo di hashing viene utilizzato su un sistema? Stiamo usando la crittografia a 2048 bit e ci chiediamo come stabilire se l'algoritmo di hashing SHA-1 con SHA-2 è in uso.
Come si può sapere quale algoritmo di hashing viene utilizzato su un sistema? Stiamo usando la crittografia a 2048 bit e ci chiediamo come stabilire se l'algoritmo di hashing SHA-1 con SHA-2 è in uso.
Beh, prima di tutto, l'hashing non aiuta in realtà nella crittografia (in senso stretto, può, con il padding OAEP, ma dubito strongmente che si applichi al tuo caso). I supponiamo che quella che chiami "crittografia" sia in realtà una firma digitale . Le firme digitali sono sfortunatamente spesso descritte come "crittografia con la chiave privata", che è un'analogia imperfetta, poiché funziona solo per RSA e in realtà non funziona per RSA, ma solo per "ordinamento". È uno stratagemma pedagogico storico che è andato storto decenni fa ed è interminabilmente ripetuto da orde di blogger e insegnanti male informati, lasciando il comune spettatore bloccato in una cupa palude di confusione mentale.
Pertanto, supponendo che tu voglia davvero parlare di firme , la tua domanda diventa più chiara. Stai utilizzando le firme basate su RSA e una generazione o verifica della firma RSA inizia con hashing ; la magia RSA con l'esponenziazione modulare viene solo dopo e funziona con il valore hash.
Dal momento che chiunque verifica la firma deve anche calcolare il valore hash, la cui funzione hash da usare normalmente non è un segreto. La maggior parte dei formati di firma include un'intestazione che lo specifica. Ad esempio, se si guarda un certificato X.509 e lo si decodifica con OpenSSL , lo strumento da riga di comando stamperà il valore della firma con qualcosa di simile:
$ openssl x509 -text -noout -in cert.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 14070511318992561002 (0xc3447f7ef0aa236a)
(...)
Signature Algorithm: sha1WithRSAEncryption
93:00:8e:ac:16:77:3c:dc:ba:89:fc:63:5f:74:c7:bb:72:3a:
6c:af:26:eb:62:04:5b:65:37:cf:c2:41:8e:de:03:db:20:c4:
Il sha1WithRSAEncryption
afferma chiaramente che in questo caso, RSA viene utilizzato con SHA-1 come funzione di hash sottostante.
Se stai facendo un po 'di reverse engineering e tale intestazione non sembra essere disponibile, puoi ancora dedurlo da un valore di firma, purché tu abbia la chiave pubblica in giro e Non ho paura di fare calcoli su grandi numeri interi. Vale a dire, la maggior parte delle firme RSA là fuori useranno PKCS # 1 , e più precisamente il "padding vecchio stile v1.5" . Con questo padding, una generazione di firma fa così:
Usando una determinata firma s e la chiave pubblica (n, e) ( n è il "modulo", e è "l'esponente pubblico"), puoi ricalcolare s e mod n e questo dovrebbe produrre la "sequenza imbottita" , che è riconoscibile grazie alla lunga sequenza di byte 0xFF; e quindi puoi vedere l'intestazione della struttura che identifica la funzione di hash, esattamente l'informazione che stai cercando.
Quando devo fare queste cose, uso il mio laptop basato su Linux perché viene fornito con dc
tool, un calcolatore da riga di comando che gestisce i grandi numeri interi (compresa l'esponenziazione modulare) e l'input / output esadecimale.
In ogni caso, vedi PKCS # 1 per i dettagli. Non puoi sperare di fare seriamente tali indagini senza acquisire una ragionevole comprensione del funzionamento interno di RSA, e PKCS # 1 è un buon punto di partenza.
Ad ogni modo , dal momento che sia il sistema di firma generazione , sia il sistema di verifica della firma, devono concordare sulla funzione hash da usare, questo dà voi due luoghi in cui potete cercare le informazioni.
Non puoi, guardando una sequenza hash , determinare quale tipo di hash l'ha generato. Se potessi, ciò suggerirebbe strongmente una non-casualità - ancora peggio, riconoscibilità - dell'hash, che lo renderebbe meno utile ai fini della sicurezza.
Puoi comunque distinguere tra un valore hash SHA-1 o SHA-2 dalla sua lunghezza. SHA-1 ha una dimensione di 160 bit (20 byte), mentre SHA-2 può andare da 224 a 512 bit .
sha-1 è di 40 caratteri nella rappresentazione esadecimale: 9BE083742A3494DD4DEE4904451AECE5394F5BAA
sha-2 sarà più lungo. sha-256 è un esempio di sha-2 e ha una rappresentazione esadecimale di 32 caratteri:
C3F41471B1E8C1505C8E4AC766E972FC108262EAA45CC1F30FAC8154B0BBF79D
sha-512 è anche sha-2 ed è, beh, comunque molti lo sono (128 caratteri):
489a101ad927ba19a9ed4442339b27498b870d53b8fad2b701e6a3e41e2e2b36b0208b092ea88239474dfeb732793a9695ad47d12e601569061a581c997de2cb
Leggi altre domande sui tag hash