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