Tengo un mensaje SOAP como este (los datos clave y los datos cifrados se han truncado):
<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>
El cuerpo se ha codificado en aes-256-cbc y luego la clave de sesión que hizo esta codificación se codificó con mi clave pública.
Mi pregunta es ¿cómo decodifico esto manualmente?
Estaba intentando lo siguiente:
-
Copiar clave de sesión cifrada en un archivo
echo "TiMPCLfQgfw==" > sessionkey.enc
-
Formato de clave a 64 caracteres como máximo por línea:
sed -e "s/.{64}/&\n/g" < sessionkey.enc > sessionkey.hex
-
Convierta la clave de sesión a formato binario para openssl (ya que el comando rsautl solo funciona con binario):
openssl enc -in sessionkey.hex -out sessionkey.bin -d -a
-
Descifre la clave de sesión con openssl y privatekey:
openssl rsautl -decrypt -in sessionkey.bin -out sessionkey.dec -inkey myprivatekey.key
-
Copiar el cuerpo del mensaje cifrado en un archivo
echo "1qsIPulqkVQ3==" > messagebody.enc
-
Formato del cuerpo del mensaje cifrado a 64 caracteres como máximo por línea (formato hexadecimal):
sed -e "s/.{64}/&\n/g" < messagebody.enc > messagebody.hex
-
Convertir la clave del cuerpo del mensaje a formato binario para openssl:
openssl enc -in messagebody.hex -out messagebody.bin -d -a
-
Descifre el cuerpo del mensaje con openssl y la clave de sesión:
openssl enc -aes-256-cbc -d -in messagebody.bin -out messagebody.dec -kfile sessionkey.dec
Pero cuando intento esto, obtengo un "número mágico malo" en este último paso. ¿Alguna idea de por qué?