CCCrypt加密很好,但无法解密

时间:2017-01-14 08:59:37

标签: swift encryption swift3

我从Issue using CCCrypt (CommonCrypt) in Swift

获取了此代码(并对其进行了修改)

我搞砸了一会儿,但无法解密功能。​​

func AESEncrypt(_ text: String, _ keyString: String) -> String {
    let keyData: NSData! = (keyString as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
    let keyBytes = UnsafeMutableRawPointer(mutating: keyData.bytes)
    let data: NSData! = (text as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
    let dataLength = size_t(data.length)
    let dataBytes = UnsafeMutableRawPointer(mutating: data.bytes)
    let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes)
    let cryptLength = size_t(cryptData!.length)

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

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(operation,
                              algoritm,
                              options,
                              keyBytes, keyLength,
                              nil,
                              dataBytes, dataLength,
                              cryptPointer, cryptLength,
                              &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData!.length = Int(numBytesEncrypted)
        let base64cryptString = cryptData!.base64EncodedString(options: .lineLength64Characters)
        return base64cryptString
    } else {
        return "error"
    }
}

func AESDecrypt(_ text: String, _ keyString: String) -> String {

    let data: NSData! = (text as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
    let keyData: NSData! = (keyString as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
    let keyBytes = UnsafeMutableRawPointer(mutating: keyData.bytes)
    let dataLength = size_t(data.length)
    let dataBytes = UnsafeMutableRawPointer(mutating: data.bytes)
    let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes)
    let cryptLength = size_t(cryptData!.length)

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

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(operation,
                              algoritm,
                              options,
                              keyBytes, keyLength,
                              nil,
                              dataBytes, dataLength,
                              cryptPointer, cryptLength,
                              &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData!.length = Int(numBytesEncrypted)
        let base64cryptString = cryptData!.base64EncodedString(options: .endLineWithLineFeed)
        return base64cryptString
    } else {
        return "error"
    }
}

AESDecrypt()给出一个看似是base64encoded的字符串,但我不能让它返回String值。

1 个答案:

答案 0 :(得分:0)

我将您的问题理解为“如何解码base64encoded String”。

这可以这样做:

let decodedData = Data(base64Encoded: base64Encoded)!
let decodedString = String(data: decodedData, encoding: .utf8)!