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

自研JS/C#跨端字符串加解密方案是否可靠?有无字符兼容问题

自定义加解密代码问题排查结论

首先直接回答你关注的核心问题:Encrypt()函数注释里提到的cCode无法生成有效字符串、导致加解密失败的情况是必然会发生的,不是极端场景才会出现的偶发问题,具体问题点如下:

  • 第一种触发场景是码点溢出:JS 中String.fromCharCode()仅支持传入 0~65535 范围的参数(对应 UTF-16 单个编码单元的取值范围),一旦计算出的cCode = 原字符编码 + keyNum超过65535,方法会自动对输入值做16位取模截断,不会抛出错误,但生成的字符已经和预期值完全不符,后续解密时减去keyNum永远无法还原出原始字符。
    这个触发门槛非常低:比如key长度到80位左右普通英文字符时,计算出的keyNum就能到10000上下,要是原始字符串里有中文、阿拉伯文这类本身编码值就在20000以上的字符,相加后直接超过65535阈值,立刻触发截断。
  • 第二种触发场景是代理对字符损坏:如果原始字符串包含emoji、生僻汉字等超出Unicode基本多文种平面(BMP)的字符,这类字符在JS和C#的字符串里都是用2个UTF-16编码单元(代理对)表示的,当前逐字符偏移的逻辑会把代理对拆成两个独立的编码单元分别计算,直接破坏代理对的配对规则,生成完全无效的乱码字符,哪怕cCode没溢出也没法正常还原。

除了你提到的无效字符串问题,当前实现还有几个不适合跨端使用的硬伤:

  • 密钥碰撞概率极高:getKey逻辑只是简单累加字符编码和key长度,只要不同key的累加值相等,就能互相解密内容,比如ab和ba算出来的keyNum完全一致,几乎没有密钥唯一性可言。
  • 加密强度可以忽略:本质是固定偏移量的凯撒密码,属于古典加密算法,只要拿到任意一小段已知明文,就能直接算出偏移量还原全部密文,完全达不到保护JS文件内容的作用。
  • 跨端兼容隐患:虽然JS和C#的char默认都是UTF-16单元,但如果两端对字符串做了自动编码规范化(比如部分C#环境默认用UTF-8处理字符串传输),很容易出现编码不一致导致解密失败的问题。

针对你需要在React Native和C#两端复用的简易加解密需求,不要自行设计加密算法。如果只是做简单的内容混淆防爬,直接用UTF-8字节数组循环异或密钥、最后输出base64的方案即可,两端都有原生的UTF-8编解码、base64转换支持,逻辑简单没有兼容坑,鲁棒性远高于现在的偏移方案;如果有实际的安全防护需求,直接用两端原生支持的标准AES对称加密即可,不要自研加密逻辑。

内容的提问来源于stack exchange,提问作者Alen.Toma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20