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

Python(PyCryptodome)AES加密后,React(CryptoJS)解密返回空串求助

解决PyCryptodome AES-CFB加密后CryptoJS解密为空的问题

出现解密后返回空字符串的核心原因是两端加密参数不匹配,以及密钥/IV的格式处理错误,以下是具体解决步骤:

问题根源

  • CFB段大小不一致:PyCryptodome的AES.MODE_CFB默认使用128位段大小,而CryptoJS的CFB模式默认是64位,这会导致解密逻辑完全错位。
  • 密钥/IV格式错误:CryptoJS要求密钥和IV必须转换为WordArray类型,直接传入字符串会导致解析失败。
  • 解密参数传递不当:AES.decrypt的参数处理不符合CryptoJS的要求,导致无法正确解析加密内容。

修改后的代码实现

Python端(PyCryptodome)

确保显式指定段大小,同时保证密钥和IV的字节长度符合AES规范(密钥:16/24/32字节;IV:16字节):

from Crypto.Cipher import AES
from base64 import b64encode

# 密钥需为16/24/32字节,IV固定16字节
secret_key = b'your-16-byte-key-xxx'
secret_iv = b'your-16-byte-iv-xxx'

def encrypt_string(string):
    # 显式指定segment_size=128,和CryptoJS对齐
    aes = AES.new(secret_key, AES.MODE_CFB, secret_iv, segment_size=128)
    encrypted = aes.encrypt(string.encode('utf-8'))
    return b64encode(encrypted).decode('utf-8')

React端(CryptoJS)

转换密钥/IV格式,并指定匹配的段大小:

import CryptoJS from 'crypto-js';

// 将密钥和IV转换为CryptoJS要求的WordArray类型
const key = CryptoJS.enc.Utf8.parse('your-16-byte-key-xxx');
const iv = CryptoJS.enc.Utf8.parse('your-16-byte-iv-xxx');

function decryptString(encryptedString) {
    const decrypted = CryptoJS.AES.decrypt(encryptedString, key, {
        mode: CryptoJS.mode.CFB,
        iv: iv,
        segmentSize: 128 // 必须和Python端的segment_size一致
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

// 使用示例
const encryptedText = "你的加密字符串";
console.log(decryptString(encryptedText));

额外注意事项

  • 密钥和IV必须在两端完全一致,包括字节长度和编码方式(示例中用UTF-8编码,若Python端是Base64生成的密钥/IV,CryptoJS需用CryptoJS.enc.Base64.parse解析)。
  • AES密钥长度必须严格符合规范:16字节对应AES-128,24字节对应AES-192,32字节对应AES-256,IV长度固定为16字节(AES块大小)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:09