首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于CommonCrypto的快速AES加密

基于CommonCrypto的快速AES加密
EN

Stack Overflow用户
提问于 2015-11-05 09:36:24
回答 1查看 7.3K关注 0票数 3

我正在开发一个iOS应用程序XCode 7.1SWIFT2.1,我尝试使用CommonCrypto库AES 128位PKCS7进行简单加密。

代码可以工作,但是每次我尝试将NSData对象转换为NSString,然后字符串时,我就会得到一个0,应用程序就会崩溃。

我调试了这个应用程序,NSData对象不是零。

当我尝试打开字符串(可选)时,会发生错误。

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

代码语言:javascript
运行
复制
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 "";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 10:08:14

加密的数据不会是有效的UTF-8字符串,因为它应该与随机位无法区分。如果您需要它的字符串形式,您需要做一些类似base64编码它或者写出字节的十六进制值。

NSData有一个base64EncodedDataWithOptions方法,它应该生成一个字符串。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33540996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档