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

