Swift CryptoKit解密PHP ChaChaPoly加密数据报错求助
解决Swift CryptoKit解密PHP加密的ChaCha20-Poly1305数据问题
场景1:PHP openssl_encrypt加密后Swift解密报incorrectParameterSize
问题根源
- Swift代码中错误地将已解码的加密数据再次执行base64编码,导致传入
SealedBox的数据格式完全不符合要求。 - 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
相关产品推荐
相关产品推荐

