Swift 使用 CommonCrypto 的 AES 加密
Swift AES encryption using CommonCrypto
我正在 XCode 7.1 和 Swift 2.1 上开发 iOS 应用程序我正在尝试使用 AES 128 位 和 PKCS7 填充使用 CommonCrypto 库 进行简单加密。
代码有效,但每次我尝试将 NSData
对象转换为 NSString
然后转换为字符串时,我得到一个 nil 并且应用程序崩溃。
我调试了应用程序,NSData
对象不是 nil。
当我尝试解包可选字符串时出现错误。
如何解决这个问题?并将 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
方法应该产生一个字符串。
我正在 XCode 7.1 和 Swift 2.1 上开发 iOS 应用程序我正在尝试使用 AES 128 位 和 PKCS7 填充使用 CommonCrypto 库 进行简单加密。
代码有效,但每次我尝试将 NSData
对象转换为 NSString
然后转换为字符串时,我得到一个 nil 并且应用程序崩溃。
我调试了应用程序,NSData
对象不是 nil。
当我尝试解包可选字符串时出现错误。
如何解决这个问题?并将 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
方法应该产生一个字符串。