当前位置: 首页 > 知识库问答 >
问题:

用Python中的AES GCM解密加密消息

伍心水
2023-03-14

我使用AES方法对从txt文件调用的sentance进行加密。我使用了GCM模式并创建了一个特定的密钥。一切都在工作(代码如下)。

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import scrypt
from Crypto.Util.number import long_to_bytes

number = 1
flag = open("sentance.txt", "rb").read()
key = scrypt(long_to_bytes(number), b"code", 32, N = 2 ** 10, r = 8, p = 1)
HexMyKey = key.hex()
cipher = AES.new(key, AES.MODE_GCM)
ciphertext, tag = cipher.encrypt_and_digest(flag)

enc = cipher.nonce + ciphertext + tag
HexEncryptedOriginalMessage = enc.hex()

我尝试实现解密过程,也就是说,我只有密钥(HexMyKeyvalue)和加密消息(HexEncryptedOriginalMessage value)并且我想对其进行解密。但问题是我错过了一些东西...
我写了下面的代码,但我有错误消息。

TypeError:decrypt_and_verify()缺少1个必需的位置参数:“received_mac_tag

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import scrypt
from Crypto.Util.number import long_to_bytes

key = bytes.fromhex(HexMykey)
data = bytes.fromhex(HexEncryptedOriginalMessage)
cipher = AES.new(key, AES.MODE_GCM)
dec = cipher.decrypt_and_verify(data)

你知道我如何解密加密的原始消息吗?
任何帮助都将不胜感激!

共有1个答案

郭阳曜
2023-03-14

PyCryptodome有一个很好的文档。这里的GCM示例使用JSON连接/分离nonce、ciphertext和tag,但是原理是相同的,可以很容易地应用到代码中。

由于使用的是隐式派生的nonce,请注意PyCryptodome应用的是16字节的nonce。但是请注意,GCM的建议是一个12字节的nonce(这里是注意部分)。

下面的解密示例使用了用发布用于加密的代码创建的密钥和密文:

from Crypto.Cipher import AES
HexMyKey = '6f9b706748f616fb0cf39d274638ee29813dbad675dd3d976e80bde4ccd7546a'
HexEncryptedOriginalMessage = '6b855acc799213c987a0e3fc4ddfb7719c9b87fcf0a0d35e2e781609143b6e2d8e743cf4aea728002a9fc77ef834'
key = bytes.fromhex(HexMyKey)
data = bytes.fromhex(HexEncryptedOriginalMessage)
cipher = AES.new(key, AES.MODE_GCM, data[:16]) # nonce
try:
    dec = cipher.decrypt_and_verify(data[16:-16], data[-16:]) # ciphertext, tag
    print(dec) # b'my secret data'
except ValueError:
    print("Decryption failed")

PyCryptodome还允许无需事先身份验证即可进行GCM解密:

cipher = AES.new(key, AES.MODE_GCM, data[:16]) # nonce
dec = cipher.decrypt(data[16:-16]) # ciphertext
print(dec) # b'my secret data'

但是,出于安全原因,对于GCM不应该这样做,因为密文只有在成功验证后才是可信的。

此外,加密和解密代码有些不一致,因为加密使用scrypt作为密钥导出函数,而解密直接使用导出的密钥。通常,人们会认为密钥也是在解密过程中派生的。您可能只为了测试而使用此捷径。

 类似资料:
  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?

  • 问题内容: 我有一个大的字节数组和rsa密钥对,由值1024初始化。强烈要求使用rsa加密和指定的密钥大小,因此无法更改它。因此,我不能将对称加密与不对称加密对称密钥一起使用。我不能使用其他任何键。我有一个字节数组,需要返回加密的字节数组。我想知道是否有现成的工具可以解决这个问题? 很抱歉出现这样的业余问题,但我确实需要帮助。 问题答案: 如前所述,您的问题只有一个答案,那就是“否”。RSA加密是

  • 问题内容: 我在PHP中有一个函数,可按如下所示加密文本: 如何在Python中解密这些值? 问题答案: 要解密这种加密形式,您将需要获得Rijndael版本。在这里可以找到一个。然后,您将需要模拟PHP Mcrypt模块中使用的键和文本填充。它们增加了填充文本和键的正确大小。他们使用的是256位块大小,并且您提供的密钥使用的密钥大小为128(如果您提供更大的密钥,则密钥大小可能会增加)。不幸的是

  • 我需要在Python中使用RSA加密和解密的帮助。 我正在创建一个私钥/公钥对,用密钥加密一条消息,并将消息写入一个文件。然后我从文件中读取密文,并使用密钥解密文本。 谁能帮我写这个代码,让解密从文件中读取密文,然后使用密钥解密密文?

  • 问题内容: 我有一个包含在byte []中的消息,该消息已用“ RSA / ECB / PKCS1Padding”加密。为了解密它,我创建了一个Cipher c并用 直到现在,我只使用 doFinal() 方法解密了小消息,并返回一个包含已解密字节的byte []。 但是在这种情况下,数据会更大(大约500字节),并且 doFinal() 方法会引发异常(javax.crypto.IllegalB