首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ValueError:当使用PyCryptodome解密来自NiFi的数据时,MAC检查失败

ValueError:当使用PyCryptodome解密来自NiFi的数据时,MAC检查失败
EN

Stack Overflow用户
提问于 2022-09-12 22:48:09
回答 1查看 70关注 0票数 0

有人能帮我解决这个问题吗?

我在NiFi中使用AES_GCM算法加密JSON,并使用KDF PBKDF2。其想法是使用PyCryptodome用python脚本解密这个JSON。

以下代码试图查看是否可以对NiFi加密消息进行解密:

代码语言:javascript
运行
复制
import base64
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Cipher import AES

# Key used in NiFi to encrypt the JSON
key = '-JaNcRfUjXn2r5u8'

# Result value after the EncryptContent processor encrypts 
# the JSON: {"id":"123", "name":"Ronald"}
value = 'nTJuV9l9uQJrWv2HXD37PE5pRmlTQUxUg7ir0oDxuxSnmuqZpbUfVk5pRmlJVn1yT10SdXKjobe9o/QHybJqwhPgCifGz2yiY9JICGehICb/zEsYUivERcMKhg=='

decodeValue = base64.b64decode(value)

salt = decodeValue[:16]
IV = decodeValue[24:40]
dataToDecrypt = decodeValue[46:-16]
tag = decodeValue[-16:]

mainKey = PBKDF2(key, salt)

cipher = AES.new(mainKey, AES.MODE_GCM, IV)
cipher.update(salt)

decryptedData = cipher.decrypt_and_verify(dataToDecrypt, tag)

print(decryptedData)

据我所知,在NIFI_PBKDF2_AES_GCM_128加密的NiFi中,密码文本输出由salt (16字节长度)、接着是salt分隔符、UTF-8字符串“NiFiSALT”(0x4E 69 69 53 41 4C 54)和 IV 组成,然后是IV分隔符UTF-8字符串“NiFiIV”(0x4E 69 46 69 49 49 56),其次是密码文本,其次是autehnticaion标记(16字节长度),但是,当试图使用此结构运行上面的脚本时,我会得到以下错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "/home/ronald/anaconda3/envs/Quind/lib/python3.10/code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 4, in <module>
  File "/home/ronald/anaconda3/envs/Quind/lib/python3.10/site-packages/Crypto/Cipher/_mode_gcm.py", line 567, in decrypt_and_verify
    self.verify(received_mac_tag)
  File "/home/ronald/anaconda3/envs/Quind/lib/python3.10/site-packages/Crypto/Cipher/_mode_gcm.py", line 508, in verify
    raise ValueError("MAC check failed")
ValueError: MAC check failed

我不明白为什么身份验证标记检查失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-12 23:43:33

解密失败有两个原因:

  • 对于PBKDF2,没有显式地指定迭代计数和摘要,因此使用默认值1000和SHA1。但是,要应用的值是160000和SHA512,根据文档: 从Crypto.Hash进口SHA512 ..。mainKey = PBKDF2(key,salt,count=160000,hmac_hash_module=SHA512)
  • 未对salt进行身份验证,即必须删除行cipher.update(salt)

通过这些更改,身份验证和解密是成功的,decryptedDatab'{"id": "123", "name": "Ronald"}'

请注意,对于GCM来说,nonce/IV允许长度为16字节,但推荐的长度为12字节。但也许改变是你无法控制的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73695969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档