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

使用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'))

错误原因分析

  1. PBKDF2参数不匹配
    NiFi的NIFI_PBKDF2_AES_GCM_128默认使用:

    • 迭代次数:10000
    • 哈希算法:SHA-256
    • 密钥长度:16字节(128位)
      原代码使用了PyCryptodome默认的SHA-1哈希、1000次迭代,生成的密钥与NiFi派生的密钥完全不同。
  2. IV长度与位置错误
    NiFi的AES-GCM使用12字节(96位)的IV(GCM推荐长度),原代码错误截取了16字节的IV,导致解密时使用的IV与加密时不一致。

  3. 密文截取位置错误
    由于IV长度计算错误,加上分隔符NiFiIV是6字节(而非假设的长度),导致密文起始位置偏移,截取的密文内容不正确。

  4. 不必要的附加数据更新
    NiFi的EncryptContent处理器在使用GCM加密时,默认不添加附加数据(Associated Data),原代码中调用cipher.update(salt)会让PyCryptodome在计算MAC时包含salt,与NiFi的MAC计算逻辑不符。

运行修正后的代码即可正确解密出{"id":"123", "name":"Ronald"}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:15:54