使用CommonCrypto进行Swift AES加密

蜡人

我正在使用Swift 2.1XCode 7.1上的iOS应用程序上进行工作,并且尝试使用CommonCrypto库使用AES 128位PKCS7填充进行简单加密

该代码有效,但是每次我尝试将NSData对象强制转换NSString为String时,都会得到nil并且应用程序崩溃。

我调试了该应用程序,但该NSData对象不是nil。

当我尝试解开String可选项时,发生错误。

如何解决这个问题?并将NSData对象正确转换为字符串?这是我的代码

static func AESEncryption(phrase: String,key: String,ivKey: String,encryptOrDecrypt: Bool) -> String {

let phraseData = phrase.dataUsingEncoding(NSUTF8StringEncoding)
let ivData = ivKey.dataUsingEncoding(NSUTF8StringEncoding)
    let keyData: NSData! = key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    let keyBytes         = UnsafePointer<Void>(keyData.bytes)
    let keyLength        = size_t(kCCKeySizeAES128)
    let dataLength       = Int(phraseData!.length)
    let dataBytes        = UnsafePointer<Void>(phraseData!.bytes)
    let bufferData       = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)!
    let bufferPointer    = UnsafeMutablePointer<Void>(bufferData.mutableBytes)
    let bufferLength     = size_t(bufferData.length)
    let ivBuffer         = UnsafePointer<Void>(ivData!.bytes)
    var bytesDecrypted   = Int(0)

    let operation = encryptOrDecrypt ? UInt32(kCCEncrypt) : UInt32(kCCDecrypt)

    let algorithm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)

    let cryptStatus = CCCrypt(
        operation,
        algorithm,
        options,
        keyBytes,
        keyLength,
        ivBuffer,
        dataBytes,
        dataLength,
        bufferPointer,
        bufferLength,
        &bytesDecrypted)
    if Int32(cryptStatus) == Int32(kCCSuccess) {
        bufferData.length = bytesDecrypted

        let data = bufferData as NSData
        let stringData =  String(data: data,encoding: NSUTF8StringEncoding)
        print("After Operation: \(stringData)")
        return stringData!
    } else {
        print("Encryption Error: \(cryptStatus)")
    }
    return "";
}
约瑟夫·洛德

加密的数据将不是有效的UTF-8字符串,因为它应该与随机位没有区别。如果需要以字符串形式使用它,则需要执行诸如base64编码之类的操作或写出字节的十六进制值。

NSData有一个base64EncodedDataWithOptions应该产生一个String方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章