在Swift中使用CCCrypt(CommonCrypt)发出问题 [英] Issue using CCCrypt (CommonCrypt) in Swift

查看:1002
本文介绍了在Swift中使用CCCrypt(CommonCrypt)发出问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在移植一个工作的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆