2017-06-08 3 views
1

私はPythonから暗号化されたbase64文字列を取得します。フォーマットはAES 256 CBCです。しかし、私がiOS Swiftを使用して解読しようとすると、解読された文字列をゼロとして返します。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

ここでPythonの実行が、私はこれが理由のpythonとiOS同じではない私にはわからない

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

を記録し得るとき、私はhttps://github.com/SwiftyBeaver/AES256CBC

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

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

AES256CBC Libのを使用AESで誰でもこの問題を解決してください。前もって感謝します。

答えて

0

まず、base64文字列をデコードする必要があると思います。 多分これが動作します(それをグーグル、私はiOSのdevのではないので、私は最終的なエラーにごめんなさい)

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))") 

またdocumentation

+1

に述べています実際に私の違いは何ですかコードとコード? – Alwin

+0

暗号文: 'bgjsvjvfuqwldmleYmdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0 + ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO'は、初期化ベクトル(' bgjsvjvfuqwldmle')およびメッセージの暗号化されたブロック( 'Ymdqc3ZqdmZ1cXdsZG1sZenhgr4Xt0 + ceARYRh1n40QkNDV/dyKbQjYLcbiXBBeO')の連結です。 –

+0

ああ、私はiOSの初心者なのであなたのアイデアをどのように活用するのか分かりません。あなたは私のためにテストできますか? – Alwin

関連する問題