我知道对类似的错误有很多回应,但没有一个能够帮助我找到解决这个问题的方法,因为它们通常与上下文相去甚远。在这种特定情况下,我正在构建一个解密消息和附件的静态函数。它嵌套在我的模型中,为应用程序中的各种服务提供说明(简单的解释)。在这个特定的部分,我正在尝试解密通过应用程序 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)
}
}
如果您知道我遗漏了什么或做错了什么,我们将不胜感激。如果需要,我可以回复整个消息和附件模型。
附言对于我对代码的糟糕解释,我深表歉意。如果您需要更多上下文,我很乐意提供。我很擅长写代码,但在用英语解释我所做的事情时却很糟糕。
AES.GCM.SealedBox 有
dropLast
方法吗?这听起来不对。我希望您以错误的顺序调用它。你几乎肯定是指:
messageData.data?.dropLast(16).suffix(16)