如何将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
相关产品推荐
相关产品推荐

