是什么导致这种类型的表达式在没有更多上下文错误的情况下模棱两可?

问题描述 投票:0回答:1

我知道对类似的错误有很多回应,但没有一个能够帮助我找到解决这个问题的方法,因为它们通常与上下文相去甚远。在这种特定情况下,我正在构建一个解密消息和附件的静态函数。它嵌套在我的模型中,为应用程序中的各种服务提供说明(简单的解释)。在这个特定的部分,我正在尝试解密通过应用程序 Messenger 发送的附件。

有问题的具体行是:

} else if let encryptedAttachment = messageData.dropLast(16).suffix(16).data {

为了提供更多上下文,这里是它所在的整个静态函数。

static func decrypt(encryptedData: Data, key: SymmetricKey) throws -> Message {
    let encryptedMessageData = encryptedData[..<32]
    let encryptedMessage = encryptedData[32...]
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let messageData = try AES.GCM.open(AES.GCM.SealedBox(combined: encryptedMessageData), using: key)
    let message = try decoder.decode(Message.self, from: messageData)
    let content = try AES.GCM.open(AES.GCM.SealedBox(combined: encryptedMessage), using: key)
    
    if let attachmentData = try? AES.GCM.open(AES.GCM.SealedBox(combined: messageData.dropLast(32)), using: key) {
        let attachment = try JSONDecoder().decode(Attachment.self, from: attachmentData)
        return Message(sender: message.sender, recipient: message.recipient, content: String(data: content, encoding: .utf8)!, attachment: attachment, timestamp: message.timestamp)
    } else if let encryptedAttachment = messageData.dropLast(16).suffix(16).data {
        do {
            let attachmentData = try AES.GCM.open(AES.GCM.SealedBox(combined: encryptedAttachment), using: key)
            let attachment = try JSONDecoder().decode(Attachment.self, from: attachmentData)
            return Message(sender: message.sender, recipient: message.recipient, content: String(data: content, encoding: .utf8)!, attachment: attachment, timestamp: message.timestamp)
        } catch {
            throw MessageError.decryptionFailed
        }
    } else {
        return Message(sender: message.sender, recipient: message.recipient, content: String(data: content, encoding: .utf8)!, timestamp: message.timestamp)
    }
}

如果您知道我遗漏了什么或做错了什么,我们将不胜感激。如果需要,我可以回复整个消息和附件模型。

附言对于我对代码的糟糕解释,我深表歉意。如果您需要更多上下文,我很乐意提供。我很擅长写代码,但在用英语解释我所做的事情时却很糟糕。

swift foundation apple-cryptokit cryptokit
1个回答
0
投票

AES.GCM.SealedBox 有

dropLast
方法吗?这听起来不对。我希望您以错误的顺序调用它。你几乎肯定是指:

messageData.data?.dropLast(16).suffix(16)
© www.soinside.com 2019 - 2024. All rights reserved.