2017-04-17 26 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。 此外,你應該檢查密鑰長度。