有人能帮我解决这个问题吗?
我在NiFi中使用AES_GCM算法加密JSON,并使用KDF PBKDF2。其想法是使用PyCryptodome用python脚本解密这个JSON。
以下代码试图查看是否可以对NiFi加密消息进行解密:
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字节长度),但是,当试图使用此结构运行上面的脚本时,我会得到以下错误:
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
我不明白为什么身份验证标记检查失败。
发布于 2022-09-12 23:43:33
解密失败有两个原因:
cipher.update(salt)
。通过这些更改,身份验证和解密是成功的,decryptedData
是b'{"id": "123", "name": "Ronald"}'
。
请注意,对于GCM来说,nonce/IV允许长度为16字节,但推荐的长度为12字节。但也许改变是你无法控制的。
https://stackoverflow.com/questions/73695969
复制相似问题