2017-07-27 5 views
0

Ich habe einen SOAP-Client, der eine Datei von einem Server herunterlädt. Die Anfrage hat ihren Körper und Anhang (die Datei) mit zwei separaten Schlüsseln verschlüsselt. Beide Schlüssel sind in den entsprechenden <xenc:EncryptedKey> Tags enthalten. Ich kann den Körper ohne Probleme mit einem der Schlüssel entschlüsseln, aber der Anhang gibt mir Probleme.Kann MTOM/XOP-Anlage mit SUDS (Python) nicht entschlüsseln

Mein Code:

from Crypto.Cipher import AES 
from Crypto import Random 

class AESCipher: 
    def __init__(self, key, BS = 16): 
     self.key = key 
     self.BS = BS 
    def _pad(self, s): 
     return s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS) 
    def _unpad(self, s): 
     return s[:-ord(s[len(s)-1:])] 
    def decrypt(self, enc): 
     enc = base64.b64decode(enc) 
     iv = enc[:self.BS] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return self._unpad(cipher.decrypt(enc[self.BS:])) 

with open('test/resp-down-file','rb') as f: 
    encFile = f.read() 

#...the key is extracted elsewhere... 

cryptor = AESCipher(key) 
cryptor.decrypt(encFile) 

Allenfalls ich bin verstümmeltes Ergebnis zu erzielen, aber in der Regel heißt es nur Error while decrypting in CBC mode. Frage: Ist jemand auf dieses Problem gestoßen? Ich bin offen für Vorschläge in Python, Java, PHP, Perl, C, so ziemlich alles, was unter Linux läuft. Gibt es etwas Besonderes an der Art, wie MTOM/XOP-Anhänge verschlüsselt sind?

Ich sah this Frage bereits, aber es hat keine richtige Antwort. Das Oktett/Stream verweist auf den Inhaltstyp, nicht auf den Übermittlungsmechanismus, sodass die Antwort falsch ist.

Bearbeiten: die Server-Spezifikation sagt, dass sie die Nachricht mit AES128-CBC-Algorithmus mit PKCS5 Padding verschlüsseln. Es macht keinen Sinn für mich, dass sie DES-Padding für AES-Verschlüsselung verwenden, aber sie sind unnachgiebig.

EDIT2: manchmal die beigefügte Nachricht nicht die richtige Länge für AES128 Entschlüsselung (z.B. 6023 Bytes oder 4071 Bytes).

Als Referenz kommt die Nachricht in diesem Format in:

--MIMEBoundaryurn_uuid_641B9D88B371C8A80C1501095406237 
Content-Type: text/xml; charset=UTF-8 
Content-Transfer-Encoding: binary 
Content-ID: <0.urn:uuid:[email protected]> 

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
... 
</soapenv:Envelope> 

--MIMEBoundaryurn_uuid_641B9D88B371C8A80C1501095406237 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
Content-ID: <urn:uuid:[email protected]> 

­8eJ¨%• }\ Œ“\ò½<( nË%¸£käö0 ‡XW�5ìR Ë�¾p�Áëş3Âå'¹5¥#=Zg¡øø{I~FP�n ×aµR^Föž¤¥EÍf«Îê�0qÊMö²È€]®PÌ>[email protected]‡ Cş®±9>Áf7P’#ã …fç~yxÔ.å–×v›±Cô„Ê 
... 
--MIMEBoundaryurn_uuid_641B9D88B371C8A80C1501095406237-- 

Antwort

0

ich das Problem gelöst. Es stellte sich heraus, ich die Möglichkeit, die empfangenen Daten (unter Verwendung von result = requests.post(....) einige nicht druckbare Zeichen abgeschnitten, weil ich result.text benutzte.

Jetzt habe ich eingeschaltet zu result.raw.read() und das Problem behoben ist.

Verwandte Themen