AES128暗号化・復号化のswift3対応について
以下の暗号化・復号化メソッドをswift3対応させたのですが、
戻り値をStringに変換する際にクラッシュするようになりました。
swift2.2
func AES128Crypt(data data:NSData, keyData:NSData, operation:Int) -> NSData? {
let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
let dataLength = Int(data.length)
let dataBytes = UnsafePointer<UInt8>(data.bytes)
let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
let cryptLength = size_t(cryptData.length)
let keyLength = size_t(kCCKeySizeAES128)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(CCOperation(operation), algoritm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
} else {
print("\(#line) Error: \(cryptStatus)")
}
return cryptData
}
swift3対応後
func AES128Crypt(data:Data, keyData:Data, operation:Int) -> Data? {
let keyBytes = (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 cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
//以下を変更
let cryptInt = Int(bitPattern: cryptData.mutableBytes)
guard let cryptPointer = UnsafeMutablePointer<UInt8>(bitPattern: cryptInt) else {
print("\(#line) Error: cryptPointer is nil")
return nil
}
//変更終了
let cryptLength = size_t(cryptData.length)
let keyLength = size_t(kCCKeySizeAES128)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(CCOperation(operation), algoritm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
} else {
print("\(#line) Error: \(cryptStatus)")
}
return cryptData as Data?
}
エラー発生箇所
let encryptStr = String(data: encryptData, encoding: String.Encoding.utf8)!
エラーメッセージ
Thread 1: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)
エラーが示す箇所
-> 0x7ef9e0 <+124>: trap
エラーが発生する原因はString(data: encryptData, encoding: String.Encoding.utf8)
の戻り値がnilなのにアンラップした為なのですが、
戻り値が格納されているencryptData
の中身はあるのに変換できない原因がわからないでいます。
またシミュレーターで動作確認を行っている際には気づかなかったので、
実機のみで発生すると思われます。
この場合、暗号化の処理が正しくないのかと思っていたのですが、
ネットを見ていると別の要因もあるという話もあったので、見当違いのことをしているのかと思い質問しました。
swift3の対応には間違いはあるでしょうか?