The following encryption and decryption methods are compatible with swift3.
It now crashes when converting the return value to String.
swift 2.2
func AES 128 Crypt(data:NSData, keyData:NSData, operation:Int) ->NSData?{
letkeyBytes=UnsafePointer<UInt8> (keyData.bytes)
let dataLength=Int(data.length)
let dataBytes = UnsafePointer<UInt8> (data.bytes)
let cryptoData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
let cryptoPointer = UnsafeMutablePointer <UInt8> (cryptData.mutableBytes)
let cryptoLength=size_t(cryptData.length)
let keyLength = size_t (kCCKeySizeAES128)
let allgoritm —CCAlgorithm=UInt32 (kCCAlgorithmAES128)
lets options: CCOoptions=UInt32 (kCCOoptionECBMode+kCCOoptionPKCS7 Padding)
var numBytesEncrypted:size_t=0
let cryptoStatus = CCCrypt(CCOoperation(operation), algorithm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptoPointer, cryptoLength,
&numBytesEnencrypted)
if UInt32(cryptStatus) == UInt32(kCCScess){
cryptoData.length=Int(numBytesEnencrypted)
} else{
print("\"(#line)Error:\"(cryptStatus)")
}
return cryptoData
}
After Swift3
func AES 128 Crypt(data:data,keyData:Data,operation:Int) ->Data?{
letkeyBytes=(keyData as NSData).bytes.bindMemory(to:UInt8.self, capacity:keyData.count)
let dataLength=Int(data.count)
let dataBytes=(data as NSData).bytes.bindMemory(to:UInt8.self, capacity:data.count)
let cryptoData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
// Change the following
let cryptoInt=Int(bitPattern:cryptData.mutableBytes)
guard let cryptoPointer = UnsafeMutablePointer <UInt8> (bitPattern:cryptInt) else {
print("\"(#line)Error:cryptPointer is nil")
return nil
}
// End of change
let cryptoLength=size_t(cryptData.length)
let keyLength = size_t (kCCKeySizeAES128)
let allgoritm —CCAlgorithm=UInt32 (kCCAlgorithmAES128)
lets options: CCOoptions=UInt32 (kCCOoptionECBMode+kCCOoptionPKCS7 Padding)
var numBytesEncrypted:size_t=0
let cryptoStatus = CCCrypt(CCOoperation(operation), algorithm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptoPointer, cryptoLength,
&numBytesEnencrypted)
if UInt32(cryptStatus) == UInt32(kCCScess){
cryptoData.length=Int(numBytesEnencrypted)
} else{
print("\"(#line)Error:\"(cryptStatus)")
}
return cryptoData as Data?
}
Where the error occurred
let encryptStr=String (data:encryptData, encoding: String.Encoding.utf8)!
Error Message
Thread1: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)
Where the error indicates
->0x7ef9e0<+124>:trap
The reason for the error is that the return value of String(data:encryptData, encoding:String.Encoding.utf8)
is nil, but I unwrapped it.
I don't know why encryptData
contains the return value, but cannot convert it.
Also, I didn't notice it when I was checking the operation of the simulator, so
I think it will only happen on the actual machine.
In this case, I thought the encryption process was not correct.
I was told that there were other factors when I was looking at the Internet, so I asked if I was doing something wrong.
Is there a mistake in handling swift3?
"If you think too hard about the ""preferably sampleable data
, keyData
"" part in the comment, I will correct the ""unrecommended writing"" and show you the original ""swift2.2"" code rewritten on Swift3."
"As it said, ""It should only occur on real machines,"" I tried both Debug and Release configurations, but the code worked fine."
func AES 128 Crypt(data:data,keyData:Data,operation:Int) ->Data{
let dataLength=data.count
varcryptData=Data(count:dataLength+kCCBlockSizeAES128)
let cryptoLength = cryptoData.count
let keyLength = kCCKeySizeAES128
let allgoritm = CCAlgorithm (kCCAlgorithmAES128)
let options = CCOoptions (kCCOoptionECBMode + kCCOoptionPKCS7 Padding)
var numBytesEnencrypted: Int=0
let cryptoStatus=keyData.withUnsafeBytes {keyBytes in
data.withUnsafeBytes {dataBytes in
cryptoData.withUnsafeMutableBytes {cryptPointer in
CCCrypt (CCOoperation (operation), algorithm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptoPointer, cryptoLength,
&numBytesEnencrypted)
}
}
}
if cryptoStatus==CCcryptorStatus(kCCScess){
cryptoData.count = numBytesEnencrypted
} else{
print("\"(#line)Error:\"(cryptStatus)")
}
return cryptoData
}
If the same situation occurs with this code, it is likely that there is a problem with how to use String.init(data:encoding:)
(the various data
s), and if there is no problem replacing this code, there is a problem with using NSData
.
If you have any new information, I will update it, so please try it and let me know.
© 2024 OneMinuteCode. All rights reserved.