使用PyCryptodome解密NiFi加密数据时MAC校验失败求助
解决NiFi AES-GCM加密的Python解密MAC校验失败问题
你的解密代码存在四个关键错误,导致MAC校验失败,以下是修正后的代码及错误分析:
修正后的代码
import base64 from Crypto.Protocol.KDF import PBKDF2 from Crypto.Cipher import AES from Crypto.Hash import SHA256 # NiFi加密所用密钥 key = '-JaNcRfUjXn2r5u8' # EncryptContent处理器加密后的结果 value = 'nTJuV9l9uQJrWv2HXD37PE5pRmlTQUxUg7ir0oDxuxSnmuqZpbUfVk5pRmlJVn1yT10SdXKjobe9o/QHybJqwhPgCifGz2yiY9JICGehICb/zEsYUivERcMKhg==' decodeValue = base64.b64decode(value) # 解析NiFi密文结构:16字节salt + "NiFiSALT" + 12字节IV + "NiFiIV" + 密文 + 16字节tag salt = decodeValue[:16] # 跳过8字节分隔符"NiFiSALT",取12字节IV iv = decodeValue[24:36] # 跳过6字节分隔符"NiFiIV",取到最后16字节之前的内容作为密文 ciphertext = decodeValue[42:-16] tag = decodeValue[-16:] # 使用NiFi默认PBKDF2参数派生密钥:10000次迭代、SHA-256哈希、128位(16字节)密钥 mainKey = PBKDF2(key, salt, dkLen=16, count=10000, hmac_hash_module=SHA256) # 初始化AES-GCM cipher,NiFi加密时未使用附加数据,无需调用update() cipher = AES.new(mainKey, AES.MODE_GCM, nonce=iv) decryptedData = cipher.decrypt_and_verify(ciphertext, tag) print(decryptedData.decode('utf-8'))
错误原因分析
PBKDF2参数不匹配
NiFi的NIFI_PBKDF2_AES_GCM_128默认使用:- 迭代次数:10000
- 哈希算法:SHA-256
- 密钥长度:16字节(128位)
原代码使用了PyCryptodome默认的SHA-1哈希、1000次迭代,生成的密钥与NiFi派生的密钥完全不同。
IV长度与位置错误
NiFi的AES-GCM使用12字节(96位)的IV(GCM推荐长度),原代码错误截取了16字节的IV,导致解密时使用的IV与加密时不一致。密文截取位置错误
由于IV长度计算错误,加上分隔符NiFiIV是6字节(而非假设的长度),导致密文起始位置偏移,截取的密文内容不正确。不必要的附加数据更新
NiFi的EncryptContent处理器在使用GCM加密时,默认不添加附加数据(Associated Data),原代码中调用cipher.update(salt)会让PyCryptodome在计算MAC时包含salt,与NiFi的MAC计算逻辑不符。
运行修正后的代码即可正确解密出{"id":"123", "name":"Ronald"}。
内容的提问来源于stack exchange,提问作者Puredepatata
相关产品推荐
相关产品推荐

