以下の暗号化・復号化メソッドを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の対応には間違いはあるでしょうか?