2016-02-25 62 views
-1

這是我第一次嘗試,所以我不知道如果我需要的是用下面的代碼實現使用加密的加密字符串。CommonCrypto生成具有16字符長度

我的問題 - 我需要它生成一個16個字符的編碼字符串,而不是正在生成的64個字符。

我對使用本機迅速庫,而不是外部框架的偏好。因爲這個問題找不到如何使用CommonCrypto。不知道這是否正確。

在那裏我得到的例子

http://sketchytech.blogspot.co.nz/2016/02/resurrecting-commoncrypto-in-swift-for.html

我使用

let keyString = "1234567812345678" 
    let message = "12345678123456781234567812345678" 
    let iv = "iv-salt-string--" // string of 16 characters in length 

    let encoded = message.aesEncrypt(keyString, iv: iv)! 
    print("encoded -> \(encoded)") 

    let unencode = encoded.aesDecrypt(keyString, iv: iv)! 
    print("unencode -> \(unencode)") 

輸出

encoded -> S81qV6F31xO8mUA1+HhsF7pHOMeE0f6Bbcmj3Zzk3EFLhQTCmfYlouorrUkYKL6K 
unencode -> 12345678123456781234567812345678 

擴展

extension String { 

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


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



       var numBytesEncrypted :size_t = 0 

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

       if UInt32(cryptStatus) == UInt32(kCCSuccess) { 
        cryptData.length = Int(numBytesEncrypted) 
        let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) 
        return base64cryptString 


       } 
       else { 
        return nil 
       } 
     } 
     return nil 
    } 

    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, 
        iv, 
        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 
    } 
} 

回答

0

你從十六進制轉換爲數據後,有16個字節的輸入。您指定PKCS#7填充kCCOptionPKCS7Padding。如果數據是塊大小的精確倍數,PKCS#7填充必須將整個填充塊添加到要加密的數據中,從而製作32字節的數據。 (這是因爲必須始終添加一些填充,並且如果沒有部分塊,唯一的方法是添加填充塊。)解密時,將刪除16個字節的填充,以便返回16個字節的數據。

參見:PKCS#7 padding

如果輸入數據是總是塊的大小(16字節),那麼你不需要添加填充,這樣就不會需要提供kCCOptionPKCS7Padding作爲一個選項的倍數。

相關問題