2016-02-25 54 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

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