You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift CryptoKit解密PHP ChaChaPoly加密数据报错求助

解决Swift CryptoKit解密PHP加密的ChaCha20-Poly1305数据问题

场景1:PHP openssl_encrypt加密后Swift解密报incorrectParameterSize

问题根源

  1. Swift代码中错误地将已解码的加密数据再次执行base64编码,导致传入SealedBox的数据格式完全不符合要求。
  2. PHP openssl_encrypt使用chacha20-poly1305时,输出的base64内容是密文+Poly1305标签,而CryptoKit的ChaChaPoly.SealedBox要求的combined格式为12字节nonce + 密文 + 16字节标签,需手动拼接nonce和密文+标签数据。

修正后的Swift代码

import CryptoKit
import Foundation

let encoded_data = "OG54KzRFKytSSmQ5d0M4PQ=="
let encoded_nonce = "MmTNTi+MmTNTi+fB"
let encoded_key = "O7IaTssF6RKgc84b8daAHojiveFY4vyQ4zKRZv3APKc="

// 正确解码各数据
guard let ciphertextWithTag = Data(base64Encoded: encoded_data),
      let nonceData = Data(base64Encoded: encoded_nonce),
      let keyData = Data(base64Encoded: encoded_key) else {
    fatalError("Invalid base64 data")
}

let key = SymmetricKey(data: keyData)

do {
    // 拼接成SealedBox要求的格式:nonce + 密文 + 标签
    let combinedData = nonceData + ciphertextWithTag
    let box = try ChaChaPoly.SealedBox(combined: combinedData)
    
    let decryptedData = try ChaChaPoly.open(box, using: key)
    let decryptedString = String(decoding: decryptedData, as: UTF8.self)
    print("Decrypted string: \(decryptedString)")
} catch {
    print("Error: \(error)")
}

场景2:PHP sodium_crypto_aead_chacha20poly1305_encrypt加密后Swift解密报authenticationFailure

问题根源

PHP的sodium_crypto_aead_chacha20poly1305_encrypt输出内容为密文+Poly1305标签,而CryptoKit的ChaChaPoly.SealedBox需要的是nonce + 密文 + 标签的组合格式,未拼接nonce会导致验证失败。

修正后的Swift代码示例

假设PHP输出的base64加密数据为xxx,base64 nonce为yyy:

import CryptoKit
import Foundation

let encoded_data = "PHP输出的加密数据base64"
let encoded_nonce = "PHP输出的nonce base64"
let encoded_key = "O7IaTssF6RKgc84b8daAHojiveFY4vyQ4zKRZv3APKc="

guard let ciphertextWithTag = Data(base64Encoded: encoded_data),
      let nonceData = Data(base64Encoded: encoded_nonce),
      let keyData = Data(base64Encoded: encoded_key) else {
    fatalError("Invalid base64 data")
}

let key = SymmetricKey(data: keyData)

do {
    // 拼接nonce和密文+标签
    let combinedData = nonceData + ciphertextWithTag
    let box = try ChaChaPoly.SealedBox(combined: combinedData)
    
    let decryptedData = try ChaChaPoly.open(box, using: key)
    let decryptedString = String(decoding: decryptedData, as: UTF8.self)
    print("Decrypted string: \(decryptedString)")
} catch {
    print("Error: \(error)")
}

内容的提问来源于stack exchange,提问作者I don't know how to code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:03:29