2017-04-17 70 views
0

我试图用128密钥解密消息与下面的代码。这是字符串的扩展名:aes 128消息解密 - 斯威夫特,iOS

func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { 
    if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding), 
     data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters), 
     cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) { 

     let keyLength    = size_t(kCCKeySizeAES128) 
     let operation: CCOperation = UInt32(kCCDecrypt) 
     let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) 
     let options: CCOptions = UInt32(options) 

     var numBytesEncrypted :size_t = 0 

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

     if UInt32(cryptStatus) == UInt32(kCCSuccess) { 
      cryptData.length = Int(numBytesEncrypted) 
      let unencryptedMessage = String(data: cryptData, encoding:NSUTF8StringEncoding) 
      return unencryptedMessage 
     } 
     else { 
      return nil 
     } 
    } 
    return nil 
} 

对于输入向量(iv),我使用零值。 有crypData存在,但我不能正确读取此,unencryptedMessage也是零。在线工具通知数据不正确,但是在后端工作正常。

键值和消息值是base64Url。

用法:

let decryptedMessage = message.aesDecrypt(keyTodecrypt, iv: nil) 

雨燕2.3

+0

AES加密没有标准设置或格式。除非您可以准确描述加密器如何构建消息,否则无法对其进行解密。你有密码吗? –

+0

您注意到密钥是Base64编码的(至少我假设这就是“base64Url”的含义)。但是你将它解码为utf-8。这可能是你的主要问题,尽管肯定会有更多。 –

+0

@zaph我的意思是说输入值是正确的,后端能够用java库解密它。这是ECB模式,而不是CBC。 –

回答

0

正如罗布说,主要问题是输入数据。所以,我已经将消息和密钥转换为十六进制值。如果您遇到同样的问题,请确保您在客户端和后端的值具有相同的编码参数。对我来说,它是UTF-8。 此外,你应该检查密钥长度。