2016-02-25 59 views
0

如何使用RNCryptor(AES128CBC)解密NSData? 我已經試着去了解文檔:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/draft-RNCryptor-Spec-v4.0.mdRNCryptor:在Swift中AES128CBC解密

編輯:

class Decription{ 
    func AES128(message: String, key: String, iv: String){ 
     let keyData: NSData! = (key as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! 
     let ivData: NSData! = (iv as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! 
     let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! 
     let cryptData  = NSMutableData(length: Int(data.length) + kCCBlockSizeAES128)! 

     let keyLength    = size_t(kCCKeySizeAES256) 
     let operation: CCOperation = UInt32(kCCDecrypt) 
     let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) 
     let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding) 

     var numBytesEncrypted :size_t = 0 

     let cryptStatus = CCCrypt(
      operation, 
      algoritm, 
      options, 
      keyData.bytes, 
      keyLength, 
      ivData.bytes, 
      data.bytes, data.length, 
      cryptData.mutableBytes, 
      cryptData.length, 
      &numBytesEncrypted 
     ) 

     if UInt32(cryptStatus) == UInt32(kCCSuccess) { 
      cryptData.length = Int(numBytesEncrypted) 
      print("Decrypted Result = \(NSString(data: cryptData, encoding: NSUTF8StringEncoding))") 
     } else { 
      print("Error: \(cryptStatus)") 
     } 
    } 
} 

我改變的代碼片段@zaph掛鉤。你可以看到上面的結果。

NSString(data: cryptData, encoding: NSUTF8StringEncoding)結果nil。問題是什麼?

+0

問題是,並非所有的數據和幾乎沒有加密的數據都可以編碼爲UTF-8或大多數編碼。如果你需要一個'String'作爲輸出使用Base64編碼。對於Base64編碼使用:'func base64EncodedStringWithOptions(_ options:NSDataBase64EncodingOptions) - > String'。 – zaph

+0

結果必須是UTF-8,它是一個JSON字符串。 –

+0

Base64由UTF-8字符組成,您將Base64編碼的字符串放在JSON中。另一個選擇是十六進制編碼加密數據,並將該字符串放入JSON中,但現在這種情況並不常見。 – zaph

回答

1

首先你使用RNCryptor加密,而不是其他一些方法,因爲RNCryptor不僅僅是AES加密,它是一個包括密鑰派生和認證的完整安全加密方法。有關更多信息,請參見RNCryptor-Spec

如果您只是想解密使用Common Crypto with Swift,請參閱此SO Answer的示例代碼。

注意:示例代碼就是這樣,它不應該在生產代碼中原樣使用。特別是ECB模式不安全,請隨機使用CBC並考慮向密碼(例如PBKDF2)添加驗證和密鑰派生。

+0

謝謝。你可以在我的答案中找到新的代碼片段。 –