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

如何将Java实现的AES加密逻辑迁移到React Native用CryptoJS正确实现

修复步骤

你需要修改3个核心逻辑,就能和Java端加密结果完全对齐:

  • 密钥截断补0逻辑:Java端会把输入的appkey强制处理为固定16字节(取前16位,长度不足时后面补0),你当前代码直接使用完整长度的appkey字节,是核心错误点
  • 删除无用代码:你定义的secSpec、ivSpec初始负数数组会被后续赋值覆盖,无实际作用,直接删除即可
  • 移除多余参数:CryptoJS的AES加密不需要额外配置keySize,密钥本身长度已经决定了加密位长
修改后可运行代码
var CryptoJS = require("crypto-js");
let appstring = "api/v1/master/Login/PinAuthentication";
let appkey = "****************************************"; // 替换为你的实际appkey

function encrypt10(){
  // 明文转UTF8字节
  let plainText = CryptoJS.enc.Utf8.parse(appstring);
  // 按照Java逻辑处理密钥:转UTF8后取前16位,不足补0
  let rawKey = CryptoJS.enc.Utf8.parse(appkey);
  let processedKey = rawKey.clone();
  processedKey.sigBytes = Math.min(processedKey.sigBytes, 16);
  // 不足16字节补0,对齐Java new byte[16]的初始值逻辑
  while (processedKey.sigBytes < 16) {
    const byteIdx = processedKey.sigBytes;
    const wordIdx = Math.floor(byteIdx / 4);
    const shift = (3 - (byteIdx % 4)) * 8;
    if (wordIdx >= processedKey.words.length) processedKey.words.push(0);
    processedKey.words[wordIdx] &= ~(0xff << shift);
    processedKey.sigBytes++;
  }

  // 执行加密
  var encrypted = CryptoJS.AES.encrypt(plainText, processedKey, {
    iv: processedKey,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  console.log(encrypted.toString());
  return encrypted.toString();
}
验证说明
  • Java端使用的PKCS5Padding和CryptoJS的Pkcs7在AES加密场景下完全兼容,不需要额外调整
  • 加密输出的encrypted.toString()默认就是Base64格式,和你预期的输出格式完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:06