Algoritmi di hash [chiuso]

-1

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.

    
posta itsecurity 28.03.2014 - 19:22
fonte

3 risposte

2

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ì:

  1. Il messaggio m è hash in h (m) .
  2. h (m) è memorizzato in una struttura che include un'intestazione esplicita che identifica la funzione di hash.
  3. La struttura risultante viene completata con l'aggiunta di, in tale ordine, un byte di valore 0x00, un byte di valore 0x01, molti byte di valore 0xFF, quindi un byte di valore 0x00.
  4. La stringa imbottita risultante viene interpretata come un grande intero modulo n ( n è il modulo RSA, parte della coppia di chiavi) e soggetto alla componente modulare che è al centro di RSA.

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.

    
risposta data 28.03.2014 - 19:49
fonte
1

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 .

    
risposta data 28.03.2014 - 19:28
fonte
0

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

    
risposta data 28.03.2014 - 19:50
fonte

Leggi altre domande sui tag