Quindi ho un messaggio SOAP come questo (dati chiave e dati crittografati sono stati troncati):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
<e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#" Id="_0">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<o:SecurityTokenReference>
<X509Data>
<X509IssuerSerial>
<X509IssuerName>CN=blah, O=blah, L=blah, S=blah, C=blah</X509IssuerName>
<X509SerialNumber>1</X509SerialNumber>
</X509IssuerSerial>
</X509Data>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData>
<e:CipherValue>TiMPCLfQgfw==</e:CipherValue>
</e:CipherData>
<e:ReferenceList>
<e:DataReference URI="#_2"/>
</e:ReferenceList>
</e:EncryptedKey>
</o:Security>
</s:Header>
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" u:Id="_1">
<e:EncryptedData xmlns:e="http://www.w3.org/2001/04/xmlenc#" Id="_2" Type="http://www.w3.org/2001/04/xmlenc#Content">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<e:CipherData>
<e:CipherValue>1qsIPulqkVQ3==</e:CipherValue>
</e:CipherData>
</e:EncryptedData>
</s:Body>
</s:Envelope>
Quindi il corpo è stato codificato in aes-256-cbc e quindi la chiave di sessione che ha fatto questa codifica è stata codificata con la mia chiave pubblica.
La mia domanda è: come posso decodificarlo manualmente?
Stavo cercando quanto segue:
-
Copia la chiave di sessione crittografata su un file
echo "TiMPCLfQgfw==" > sessionkey.enc
-
Formatta la chiave in 64 caratteri max per riga:
sed -e "s/.{64}/&\n/g" < sessionkey.enc > sessionkey.hex
-
Converti la chiave di sessione in formato binario per openssl (dato che il comando rsautl funziona solo con binario):
openssl enc -in sessionkey.hex -out sessionkey.bin -d -a
-
Decrittografa la chiave di sessione usando openssl e privatekey:
openssl rsautl -decrypt -in sessionkey.bin -out sessionkey.dec -inkey myprivatekey.key
-
Copia il corpo del messaggio crittografato in un file
echo "1qsIPulqkVQ3==" > messagebody.enc
-
Formatta il corpo del messaggio crittografato a 64 caratteri per riga (formato esadecimale):
sed -e "s/.{64}/&\n/g" < messagebody.enc > messagebody.hex
-
Converti la chiave del corpo del messaggio nel formato binario per openssl:
openssl enc -in messagebody.hex -out messagebody.bin -d -a
-
Decifra il corpo del messaggio usando openssl e chiave di sessione:
openssl enc -aes-256-cbc -d -in messagebody.bin -out messagebody.dec -kfile sessionkey.dec
Ma ottengo "numero magico magico" su questo ultimo passaggio quando provo questo. Qualche idea, perché?