React Native AES解密结果出现s:19:...格式,不符预期求解决
问题排查与解决方案
核心问题分析
你得到的s:19:"halo;world;78221199";是PHP字符串序列化格式,说明解密后的原始内容是PHP序列化的字符串,并非直接的目标文本。需要对解密结果做反序列化处理才能得到预期值。同时注意:你代码中使用的encryptedData和base64Key是旧值,需替换为你提供的最新待解密数据和密钥。
修正后的代码
import React, { useEffect, useState } from 'react'; import { View, Text } from 'react-native'; import { atob } from 'js-base64'; import CryptoJS from 'crypto-js'; // 替换为你提供的最新密钥 const base64Key = 'xp+EtmX14oXQMT6AAOnztGU4dRH8OY6YqxkEknmkziw='; const Decrypt = () => { const [decryptedData, setDecryptedData] = useState(''); // 处理PHP字符串反序列化 const unserializePhpString = (serializedStr) => { const match = serializedStr.match(/^s:(\d+):"(.*?)";$/); if (match && match.length === 3) { const length = parseInt(match[1], 10); const value = match[2]; if (value.length === length) { return value; } } return serializedStr; }; useEffect(() => { decryptData(); }, []); const decryptData = () => { try { // 替换为你提供的最新待解密数据 const encryptedData = 'eyJpdiI6Im5qQTNHbWZwUlpCR1YrK2VhRGJuZVE9PSIsInZhbHVlIjoibW1aVE5qWmI3cjlDendMSTR3bCtNN2RpM0hKRmpVM0FML3RYazJoc3ZQYWVaRHp1L2JkNlgwWE9VWmFzRVJqYSIsIm1hYyI6IjBiNTE0NGQyM2UxZGNmNTgyYzk0YTEzMGVjMmRhZDY4NjQ0NDA0ZDgwY2FkNmMzYjU2MTlhMDYzYjMxNmEwNDEiLCJ0YWciOiIifQ=='; const decodedData = atob(encryptedData); const { iv, value } = JSON.parse(decodedData); const key = CryptoJS.enc.Base64.parse(base64Key); const decryptedValue = CryptoJS.AES.decrypt(value, key, { iv: CryptoJS.enc.Base64.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); // 反序列化处理解密结果 const targetValue = unserializePhpString(decryptedValue); console.log(targetValue); setDecryptedData(targetValue); } catch (error) { console.error('Decryption error:', error); setDecryptedData('Decryption error'); } }; return ( <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}> <View style={{ flexDirection: 'row' }}> <Text>Decrypted Data: </Text> <Text style={{ color: 'red', marginLeft: 4 }}>{decryptedData}</Text> </View> </View> ); }; export default Decrypt;
关键改动说明
- 替换密钥与待解密数据:将代码中旧的密钥和加密数据替换为你提供的最新值,确保解密对象正确。
- 新增PHP反序列化函数:
unserializePhpString匹配PHP序列化字符串格式,提取出真实目标文本,同时做长度校验避免异常格式。 - 显式指定加密参数:虽然CryptoJS默认使用CBC模式和Pkcs7填充,显式声明可以避免环境或版本差异导致的隐性问题。
验证说明
运行修正后的代码,解密后会先得到PHP序列化字符串,经过反序列化处理后,即可得到序列化内的原始文本(注:你提供的预期值中是halo;world:78221199,但序列化内容里是halo;world;78221199,需确认是否为输入笔误,代码会如实提取序列化内的内容)。
内容的提问来源于stack exchange,提问作者alep
相关产品推荐
相关产品推荐

