2016-02-25 2 views
1

Я получаю эту ошибку при расшифровке AES128CBC зашифрованы JSON:CryptoSwift AES128CBC с Swift

утверждение не удалось: Размер блока и вектор инициализации должен быть такой же длины !: файл ##### для IOS/CryptoSwift/Источники/CryptoSwift/AES.swift, строка 97

Я использую CryptoSwift Framework с последними Xcode.

Мой метод:

func aes128(key: String, iv: String) throws -> String?{ 
     if let aes: AES = try AES(key: key, iv: iv, blockMode: .CBC){ 
      if let encrypted: [UInt8] = try aes.encrypt([UInt8](self.utf8), padding: PKCS7()){ 
       return String(data: NSData.withBytes(encrypted), encoding: NSUTF8StringEncoding) 
      } 
     } 

     return nil 
} 

Вызов:

do{ 
    print(try dataStr.aes128("8e0c0e73f97f2eb386ad75ba86051334", iv: "aa17ffc4ea4b1eac8fa0b56872f34e5f")) 
}catch{ 

} 
+0

В случае, если не 'iv' быть '[UInt8]'? Вы передаете 'String'. – SmokeDispenser

+0

Кроме того, ключ и iv выглядят как хеши. Вы понимаете, что это плохая идея, поскольку она сводит к минимуму ключевую плоскость в шестнадцатеричные строки? Это делает грубую силу намного проще. – SmokeDispenser

+0

Ваш ключ и iv имеют одинаковую длину, 32 байта. Предполагая, что вы используете 128-битный размер блока, ваш iv должен быть 16 байтов. Взгляните на этот ответ за идеи о том, как использовать CryptoSwift: http://stackoverflow.com/a/30820691/887210 – ColGraff

ответ

0

Мой метод:

func aes128(key: [UInt8], iv: [UInt8]) throws -> String?{ 
    let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) 
    let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes(), padding: PKCS7()) 
    let decData = NSData(bytes: dec, length: Int(dec.count)) 
    let result = NSString(data: decData, encoding: NSUTF8StringEncoding) 
    return String(result!) 
} 

Вызов:

do{ 
    let secret: [UInt8] = self.getAuthSecret(.LoginSecret)!.byte 
    let ivSlice = secret[0..<16] 
    let ivArray = Array<UInt8>(ivSlice) 

    let keySlice = secret[16..<32] 
    let keyArray = Array<UInt8>(keySlice) 

    print(try dataStr.aes128(keyArray, iv: ivArray)) 
}catch{ 

} 
+0

CryptoSwift, шифрование AES в 500-1000 раз медленнее, чем использование Common Crypto, что может не беспокоить ваше использование. CryptoSwift не был хорошо проверен, а Common Crypto сертифицирован FIPS 140-2. – zaph