Chiave SMIM di decodifica e-mail con OpenSSL

9

Vorrei sapere se è possibile utilizzare il comando openssl per recuperare e decrittografare la chiave per la crittografia / decryptig del contenuto della posta elettronica. So che posso decifrare l'intera posta criptata con qualcosa di simile

openssl smime -decrypt -in enc_mail.eml -inkey recip_priv.pem > dec_mail.eml

Tuttavia, mi piacerebbe vedere i passaggi in mezzo. Se capisco bene la procedura, il contenuto effettivo dell'email viene crittografato non dal pubkey del destinatario, ma con una chiave generata a caso sul lato del mittente. Questa chiave viene quindi crittografata con il pubkey del destinatario e allegata al messaggio crittografato. Ho ragione? È possibile utilizzare openssl per visualizzare la chiave crittografata allegata e decrittografarla separatamente?

Grazie.

    
posta Jakub Žitný 09.11.2013 - 19:38
fonte

2 risposte

9

Sì, puoi. Questo esempio utilizza openssl smime con il CBC RC2 predefinito con una chiave a 40 bit. Il nuovo % sub-comandocms si comporta in modo leggermente diverso e utilizza 3 DES per impostazione predefinita. Probabilmente non dovresti usare nessuno di questi algoritmi per crittografare i dati importanti ; -)

Ci sono due piccoli avvertimenti: in primo luogo, userò anche un paio di altri strumenti (anche se OpenSSL è usato per tutti i lavori pesanti), e in secondo luogo ho intenzione di fare alcune ipotesi su come l'email è stata crittografata.

L'en / decryption è sulla falsariga della maggior parte dei metodi di RSA: usa (lento, costoso) RSA per decodificare una chiave simmetrica, e usa la chiave simmetrica veloce per decodificare i dati reali. (Vedi questa domanda o questo per ulteriori informazioni sullo sfondo).

Prendi la tua email, estrai la parte P7M e decodificala. Se disponi di una singola porzione .p7m codificata in base64, puoi farlo facilmente con metamail :

$ metamail -wy enc_mail.eml

Salva il file P7M. Questo è un ASN.1 codificato da DER CMS (PKCS # 7) file, in modo che possiamo sbirciare dentro:

  $ dumpasn1 -tilda  smime.p7m
   0 1946: SEQUENCE {
   4    9: . OBJECT IDENTIFIER envelopedData (1 2 840 113549 1 7 3)
         : . . (PKCS #7)
  15 1931: . [0] {
                  [ .. certificate details and whatnot omitted ...]
 188   13: . . . . . SEQUENCE {
 190    9: . . . . . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
         : . . . . . . . (PKCS #1)
 201    0: . . . . . . NULL
         : . . . . . . }
 203  256: . . . . . OCTET STRING    
         : . . . . . . A0 DA EA FB EA 1A 0F 81    ........
         : . . . . . . F4 30 9F 78 5C 9B A7 27    .0.x\..'
                       [ ... blob snipped ...]
 463 1483: . . . SEQUENCE {
 467    9: . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
         : . . . . . (PKCS #7)
 478   26: . . . . SEQUENCE {
 480    8: . . . . . OBJECT IDENTIFIER rc2CBC (1 2 840 113549 3 2)
         : . . . . . . (RSADSI encryptionAlgorithm)
 490   14: . . . . . SEQUENCE {
 492    2: . . . . . . INTEGER 160
 496    8: . . . . . . OCTET STRING 3E EA 0E 12 37 A8 56 70                 
         : . . . . . . }
         : . . . . . }
 506 1440: . . . . [0]    
         : . . . . . A5 FF A1 70 2C AD 82 6A    ...p,..j
         : . . . . . C7 F0 84 E8 9E 93 8F 53    .......S
                     [... blob snipped ...]

Sto utilizzando dumpasn1 perché openssl asn1parse non è incline a visualizzare o eseguire il dump i vari blob a cui siamo interessati. La struttura della tua email varierà da quanto sopra ovviamente. Le colonne 1 e 2 sono l'offset e la dimensione di ciascuna sottostruttura (eventualmente annidata).

Le parti interessanti sono agli offset:

  • 188 i dettagli di crittografia RSA, seguiti a offset 203 da dati crittografati
  • 463 i dettagli e i parametri di crittografia S / MIME (RC2 CBC)
  • 506 il blob crittografato

All'offset 188 possiamo vedere che viene utilizzato RSA, seguito da 256 byte di dati, quindi estrarre quel blob di dati (offset 203) e convertirlo in binario:

$ dumpasn1 -a -203 smime.p7m | tail -qn +2 | xxd -r -p > rsa.bin

(annota l'offset iniziale -203 e l'uso di tail per saltare la prima riga di output.Questo è un po 'contorto, ma sfortunatamente sia dumpasn1 che openssl asn1parse lasciano intatto il prefisso type-length quando provi a tagliare e lanciare oggetti.)

Decifra questi dati usando RSA:

$ openssl rsautl -inkey recip_priv.pem -in rsa.bin -decrypt -out rc2key.bin
$ xxd -u -p  rc2key.bin
92F6EB53B1

In questo caso otteniamo l'output di 5 byte (40 bit), la chiave simmetrica di cui abbiamo bisogno. L'input era PKCS # 1 v1.5 riempito (vedi §8.1) per vari motivi , quindi la differenza di dimensioni.

Il carico utile principale (email) è nel blob a offset 506, estrailo in un file:

$ dumpasn1 -a -506 smime.p7m | tail -qn +2 | xxd -r -p > email.bin

Ora ecco un po 'complicato, per RC2 fai riferimento alla sezione 6 di RFC 2268 :

rc2CBC OBJECT IDENTIFIER
 ::= {iso(1) member-body(2) US(840) rsadsi(113549)
      encryptionAlgorithm(3) 2}

RC2-CBCParameter ::= CHOICE {
  iv IV,
  params SEQUENCE {
    version RC2Version,
    iv IV
  }
}

RC2Version ::= INTEGER -- 1-1024
IV ::= OCTET STRING -- 8 octets

Questo spiega la struttura dei dati all'offset 490:

 480    8: . . . . . OBJECT IDENTIFIER rc2CBC (1 2 840 113549 3 2)
         : . . . . . . (RSADSI encryptionAlgorithm)
 490   14: . . . . . SEQUENCE {
 492    2: . . . . . . INTEGER 160
 496    8: . . . . . . OCTET STRING 3E EA 0E 12 37 A8 56 70                 
         : . . . . . . }

(Puoi confermare che RC2Version 160 (0xa0) corrisponde alla dimensione della chiave 40 bit (0x28) nella tabella EKB.)

Quindi, mettendo tutto insieme: l'algoritmo di crittografia S / MIME (RC2 40 bit CBC, offset 480), il tasto RC2 (decifrato da blob a offset 203), RC2 IV (non crittografato, offset 496) e il payload crittografato (offset 506):

$ openssl enc -d -rc2-40-cbc -in email.bin -out email.txt -K 92F6EB53B1 -iv 3EEA0E1237A85670

e email.txt dovrebbe essere quello che stai cercando.

Punte:

  • assicurati di non utilizzare una versione antica di xxd , potrebbe manipolare dati esadecimali di input
  • la struttura, le dimensioni e gli offset varieranno ovviamente per messaggio, chiavi e algoritmo
  • Trovo che openssl enc -kfile ... non funzioni, attenersi a -K
  • openssl smime può aver modificato il tuo messaggio prima della crittografia (requisiti CRLF )
  • berdump è uno strumento utile in quanto il suo output è più suscettibile di ulteriori elaborazioni. Poiché DER è un sottoinsieme di BER, puoi puntarlo direttamente su un file DER PKCS # 7
risposta data 11.11.2013 - 19:32
fonte
0

S / MIME utilizza PKCS7 . Probabilmente devi scrivere il codice da solo.

Ecco un esempio di come farlo in C ++: link

E questo è un esempio per Java: link

    
risposta data 10.11.2013 - 00:15
fonte

Leggi altre domande sui tag