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

React Native中二进制字符串解密异常问题排查与解决

React Native与Electron AES-CBC解密二进制数据差异问题

我们在React Native和Electron平台测试同一段加密十六进制字符串的解密,两者使用相同的KEY和IV,且hexEncryptedData的Base64编码一致。Electron端能正确解密出1x1像素的PNG图片并正常渲染,但React Native端解密出现问题,仅在处理二进制字符串时异常,解密普通字符串(如"Hello World!")和JSON数据则正常。

密钥、向量及加密数据:

var key = '902e80631a967943289d73274a544de26b856c288b4e60b71004424a7426bdd3';

var iv = 'a9fd946e7f732703dd5e30e8d82aeed3';

var hexEncryptedData = '29f3cade12b11184f6c65307af46290c191915487d63b7d8e1a11a4643553636871ad9324ba66a9ec5f0797f2fdbe4d7374734cad06b0ac79073bc476690b913d143d34626bb75e943598de86c9f01f515ca4dd6becbd85cfe3b94ebea44219f0f64921657952d8ee4ce2d824ac4476bd50598f0a9b3f9321e71a9471a7c05aa'

React Native尝试1(使用react-native-aes-crypto):

import Aes from 'react-native-aes-crypto'; 
base64EncryptedData = Buffer.from(hexEncryptedData, 'hex').toString('base64'); 
var data = await Aes.decrypt(base64EncryptedData, key, iv, 'aes-256-cbc');
  • Debug模式下得到的Uint8Array:[253,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,1,0,0,0,1,8,6,0,0,0,31,21,9,0,0,0,1,115,82,71,66,0,253,253,28,253,0,0,0,4,103,65,77,65,0,0,253,253,11,253,97,5,0,0,0,9,112,72,89,115,0,0,14,253,0,0,14,253,1,21,40,74,253,0,0,0,13,73,68,65,84,24,87,99,120,43,253,253,31,0,5,84,2,45,253,61,253,253,0,0,0,0,73,69,78,68,253,66,96,253]
  • 非Debug模式下得到的Buffer:[253, 80, 78, 71, 13, 10, 26, 10]

React Native尝试2(使用aes-js):

var aesjs = require('aes-js');
var encryptedBytes = aesjs.utils.hex.toBytes(hexEncryptedData);
var aesCbc = new aesjs.ModeOfOperation.cbc(Buffer.from(key, 'hex'), Buffer.from(iv, 'hex'));
var decryptedBytes = aesCbc.decrypt(encryptedBytes);

得到的Uint8Array:[137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252, 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 194, 0, 0, 14, 194, 1, 21, 40, 74, 128, 0, 0, 0, 13, 73, 68, 65, 84, 24, 87, 99, 120, 43, 163, 242, 31, 0, 5, 84, 2, 45, 198, 61, 146, 157, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, 8, 8, 8, 8, 8, 8, 8, 8]

问题在于末尾的填充部分,其余输出与Electron端一致

Electron端实现:

var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
var decryptedData = decipher.update(hexEncryptedData, 'hex', 'utf8') + decipher.final('utf8');

得到的Uint8Array:[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,1,0,0,0,1,8,6,0,0,0,31,21,196,137,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,0,0,14,194,0,0,14,194,1,21,40,74,128,0,0,0,13,73,68,65,84,24,87,99,120,43,163,242,31,0,5,84,2,45,198,61,146,157,0,0,0,0,73,69,78,68,174,66,96,130]

Electron端解密结果正确,可正常渲染图片,但React Native端解密异常。另外,在React Native的Debug模式下使用window.crypto.subtle.decrypt可正常解密,但该API在非Debug模式下不可用。请问为何React Native端解密会出现问题?

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:24:57