2017-06-08 4 views
1

Ich bekomme eine verschlüsselte Base64-Zeichenfolge von Python. Das Format ist AES 256 CBC. Aber wenn ich versuche, mit iOS Swift entschlüsseln, geben Sie entschlüsselte Zeichenfolge als Null zurück.Wie entschlüsselt man die verschlüsselte Zeichenkette von Python?

# coding=utf-8 
import base64 
from random import choice 
from string import letters 

try: 
    from Crypto import Random 
    from Crypto.Cipher import AES 
except ImportError: 
    import crypto 
    import sys 

    sys.modules['Crypto'] = crypto 
    from crypto.Cipher import AES 
    from crypto import Random 


class AESCipher(object): 
    def __init__(self, key): 
     self.bs = 32 
     self.key = key 

    def encrypt(self, raw): 
     _raw = raw 
     raw = self._pad(raw) 

     print raw, ';' 
     print _raw, ';' 

     iv = "".join([choice(letters[:26]) for i in xrange(16)]) 
     print " iv :", iv 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return base64.b64encode(iv + cipher.encrypt(raw)) 

    def decrypt(self, enc): 
     enc = base64.b64decode(enc) 
     iv = enc[:AES.block_size] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8') 

    def _pad(self, s): 
     a = (self.bs - len(s) % self.bs) 
     b = chr(self.bs - len(s) % self.bs) 
     return s + a * b 

    @staticmethod 
    def _unpad(s): 
     return s[:-ord(s[len(s) - 1:])] 
def encrypt(k, t): 
    o = AESCipher(k) 
    return o.encrypt(t) 


def decrypt(k, t): 
    o = AESCipher(k) 
    return o.decrypt(t) 


def main(): 
    k = "qwertyuiopasdfghjklzxcvbnmqwerty" 
    s1 = "Hello World!" 

    d2 = encrypt(k, s1) 

    print " Password :", k 
    print "Encrypted :", d2 
    print " Plain :", decrypt(k, d2) 

if __name__ == '__main__': 
    main() 

iOS

Hier verwende ich AES256CBC Lib https://github.com/SwiftyBeaver/AES256CBC

let decrypted = AES256CBC.decryptString("Ymdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0+ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO", password: "qwertyuiopasdfghjklzxcvbnmqwerty") 

     print("decrypted: \(String(describing: decrypted))") // here I get nil 

wenn Python Run ich dieses

Logbücher
iv : bgjsvjvfuqwldmle 
Password : qwertyuiopasdfghjklzxcvbnmqwerty 
Encrypted : Ymdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0+ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO 
    Plain : Hello World! 

Ich weiß nicht, warum Python und iOS nicht gleiche in AES. Jeder, der dieses Problem löst, bitte die Antwort unten angeben. Danke im Voraus.

Antwort

0

Ich denke, Sie müssen zuerst Ihre Base64-Zeichenfolge decodieren. Vielleicht wird dies funktionieren (gegoogelt es nur, ich bin kein iOS Entwickler, so muß ich leider eventuellen Fehler)

let decodedData = NSData("Ymdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0+ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO": base64String, options:NSDataBase64DecodingOptions.fromRaw(0)!) 
let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) 
let decrypted = AES256CBC.decryptString(decodedString, password: "qwertyuiopasdfghjklzxcvbnmqwerty") 
     print("decrypted: \(String(describing: decrypted))") 

Es ist auch in den documentation

+1

angegeben Eigentlich, was ist der Unterschied zwischen meinem Code und dein Code? – Alwin

+0

Der Chiffretext: 'bgjsvjvfuqwldmleYmdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0 + ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO' Verkettung der Initialisierungsvektor (' bgjsvjvfuqwldmle') und die verschlüsselten Blöcke Ihrer Nachricht ist ('Ymdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0 + ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO'). –

+0

Das ist ok, aber ich weiß nicht, wie ich deine Ideen nutzen soll, weil ich Anfänger in iOS bin. Kannst du für mich testen? – Alwin

Verwandte Themen