在Swift中使用CCCrypt(CommonCrypt)发出问题 [英] Issue using CCCrypt (CommonCrypt) in Swift
问题描述
我正在移植一个工作的Objective-C类别(NSData + AESCrypt.m)到Swift,我发现一个问题使用的指针。 Swift中的加密部分的代码正确编译,但生成一个运行时EXEC_BAD_ACCES错误。
我到目前为止的代码是(我试图剖析代码,可能):
let key =123456789012345678901234567890120
let keyLength = UInt(kCCKeySizeAES256 + 1)
let keyPointer = strdup(key)// Convert key to< UnsafeMutablePointer< Int8>
let message =不要尝试读取这个文本。
let data =(message as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let dataBytes = data ?.bytes
let length = data?.length
let dataLength = UInt(length!)
let dataPointer = UnsafePointer< UInt8>(dataBytes!)
操作:CCOperation = UInt32(kCCEncrypt)
let algoritm:CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options:CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
let cryptBufferSize = UInt + kCCBlockSizeAES128)
var cryptBuffer = [UInt8](count:Int(cryptBufferSize),repeatedValue:0)
var cryptBufferPointer = UnsafeMutablePointer< UInt8>(cryptBuffer)
var numBytesEncrypted = UnsafeMutablePointer< UInt>()
var cryptStatus = CCCrypt(operation,algoritm,options,keyPointer,keyLength,nil,dataPointer,dataLength,cryptBufferPointer,cryptBufferSize,numBytesEncrypted)
if UInt32(cryptStatus)== UInt32(kCCSuccess){
let size = NSInteger(cryptBufferSize)
let encryptedData = NSData(bytes:cryptBufferPointer,length:size)
let encryptedString = NSString加密字符串= \(encryptedString))// EXEC_BAD_ACCESS错误
} else {
println(Error:\(cryptStatus))
}
encryptedData对象显示以下信息:
< 279c2d0f d3ce2200 0dc10cc1 9df46e76 cb26f423 7c9bde76 f9d8d0e2 632acef9 74fb0614 4717422b 684d1889 e3ce882c 00000000 00000000 00000000 0000>
但是encryptedString在调试器中显示 0x0000000000
,并尝试 println()
它会生成EXEC_BAD_ACCESS错误
Rgds ....
Swift 2.0
这里是一个例子
如果这不是完全需要的方法应该是一个很好的例子
注意:键字符串被转换为数据
向项目中添加Security.framework
添加 #import< CommonCrypto / CommonCryptor.h>
到桥接头。
let keyString =12345678901234567890123456789012
let keyData:NSData! =(keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding)as NSData!
print(keyLength = \(keyData.length),keyData = \(keyData))
let message =不要尝试阅读此文本
let data:NSData! =(message as NSString).dataUsingEncoding(NSUTF8StringEncoding)as NSData!
print(data length = \(data.length),data = \(data))
let cryptData = NSMutableData(length:Int(data.length)+ kCCBlockSizeAES128 )!
let keyLength = size_t(kCCKeySizeAES256)
让操作:CCOperation = UInt32(kCCEncrypt)
let algoritm:CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options:CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
var numBytesEncrypted:size_t = 0
var cryptStatus = CCCrypt(operation,
algoritm,
options,
keyData.bytes,keyLength,
nil,
data.bytes,data.length,
cryptData.mutableBytes,cryptData.length,
& numBytesEncrypted)
如果UInt32(cryptStatus)== UInt32(kCCSuccess){
cryptData.length = Int(numBytesEncrypted)
print(cryptLength = \(numBytesEncrypted),cryptData = \(cryptData) )
//不是所有的数据都是UTF-8字符串,所以使用Base64
let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
print(base64cryptString = \ base64cryptString))
} else {
print(Error:\(cryptStatus))
}
输出:
keyLength = 32,keyData =< 31323334 35363738 39303132 33343536 37383930 31323334 35363738 39303132>
dataLength = 46,data =< 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666>
cryptLength = 48,cryptData =< 118a32dc c23f7caa 883abc3c 1c7f0770 e200016b 2737acfa 17bb96fb a02b02a7 c147603b 06acd863 94bb8ff2 6cb14515>
base64cryptString = EYoy3MI / fKqIOrw8HH8HcOIAAWsnN6z6F7uW + 6ArAqfBR2A7BqzYY5S7j / JssUUV
I am porting a working Objective-C Category (NSData+AESCrypt.m) to Swift and I have found an issue working with the pointers. The code for the encrypting part in Swift compiles correctly, but generates a runtime EXEC_BAD_ACCES error.
The code I have so far is (I tried to dissect the code as much as possible) :
let key = "123456789012345678901234567890120"
let keyLength = UInt(kCCKeySizeAES256 + 1)
let keyPointer = strdup(key) // Convert key to <UnsafeMutablePointer<Int8>
let message = "Don´t try to read this text. Top Secret Stuff"
let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let dataBytes = data?.bytes
let length = data?.length
let dataLength = UInt(length!)
let dataPointer = UnsafePointer<UInt8>(dataBytes!)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
let cryptBufferSize = UInt(dataLength + kCCBlockSizeAES128)
var cryptBuffer = [UInt8](count: Int(cryptBufferSize), repeatedValue: 0)
var cryptBufferPointer = UnsafeMutablePointer<UInt8>(cryptBuffer)
var numBytesEncrypted = UnsafeMutablePointer<UInt>()
var cryptStatus = CCCrypt(operation, algoritm, options, keyPointer, keyLength, nil, dataPointer, dataLength, cryptBufferPointer, cryptBufferSize, numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
let size = NSInteger(cryptBufferSize)
let encryptedData = NSData(bytes: cryptBufferPointer, length: size)
let encryptedString = NSString(data: encryptedData, encoding: NSUTF8StringEncoding)
println("Encrypted String = \(encryptedString)") // EXEC_BAD_ACCESS error
} else {
println("Error: \(cryptStatus)")
}
The encryptedData object shows the following info:
<279c2d0f d3ce2200 0dc10cc1 9df46e76 cb26f423 7c9bde76 f9d8d0e2 632acef9 74fb0614 4717422b 684d1889 e3ce882c 00000000 00000000 00000000 0000>
But the encryptedString shows 0x0000000000
in the debugger, and trying to println()
it generates the EXEC_BAD_ACCESS error
Any idea what is missing?
Rgds....
Swift 2.0
Here is an example
If this is not exactly what is needed the methods should be a good example
Note: the key string is converted to data
Add Security.framework to the project
Add #import <CommonCrypto/CommonCryptor.h>
to the bridging header.
let keyString = "12345678901234567890123456789012"
let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
print("keyLength = \(keyData.length), keyData = \(keyData)")
let message = "Don´t try to read this text. Top Secret Stuff"
let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
print("data length = \(data.length), data = \(data)")
let cryptData = NSMutableData(length: Int(data.length) + kCCBlockSizeAES128)!
let keyLength = size_t(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
var cryptStatus = CCCrypt(operation,
algoritm,
options,
keyData.bytes, keyLength,
nil,
data.bytes, data.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")
// Not all data is a UTF-8 string so Base64 is used
let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
print("base64cryptString = \(base64cryptString)")
} else {
print("Error: \(cryptStatus)")
}
Output:
keyLength = 32, keyData = <31323334 35363738 39303132 33343536 37383930 31323334 35363738 39303132>
dataLength = 46, data = <446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666>
cryptLength = 48, cryptData = <118a32dc c23f7caa 883abc3c 1c7f0770 e200016b 2737acfa 17bb96fb a02b02a7 c147603b 06acd863 94bb8ff2 6cb14515>
base64cryptString = EYoy3MI/fKqIOrw8HH8HcOIAAWsnN6z6F7uW+6ArAqfBR2A7BqzYY5S7j/JssUUV
这篇关于在Swift中使用CCCrypt(CommonCrypt)发出问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!