【python】Python中使用GCM加密模式

本人在java中运行的一段AES加密代码,采用的是GCM加密模式,出于某种原因需要将这部分代码移植到python项目中去,但发现python自带的加密库中不支持GCM这一加密模式,经过google之后,发现第三方加密库pyca/cryptography支持,所以记录下来

一、GCM加密模式的介绍

GCM中的G就是指GMAC,C就是指CTR。

GCM可以提供对消息的加密和完整性校验,另外,它还可以提供附加消息的完整性校验。在实际应用场景中,有些信息是我们不需要保密,但信息的接收者需要确认它的真实性的,例如源IP,源端口,目的IP,IV,等等。因此,我们可以将这一部分作为附加消息加入到MAC值的计算当中。下图的Ek表示用对称秘钥k对输入做AES运算。最后,密文接收者会收到密文、IV(计数器CTR的初始值)、MAC值。

image

(以上介绍原文链接:https://blog.csdn.net/T0mato_/article/details/53160772)

之所以选用GCM,也就是因为它比常用的CBC加密模式更加安全和完善,以后建议同学们新开发的软件可以考虑采用这种方式

二、Python(3)实现

1、安装cryptography


pip install cryptography

2、代码实现

import os
from cryptography.hazmat.backendsimport default_backend
from cryptography.hazmat.primitives.ciphersimport (
Cipher, algorithms, modes
)

def encrypt(key, plaintext):
  iv = os.urandom(12)

  encryptor = Cipher(
        algorithms.AES(key),
        modes.GCM(iv),
        backend=default_backend()
  ).encryptor()

  ciphertext = encryptor.update(plaintext) + encryptor.finalize() + encryptor.tag #将tag直接追加在最后,即可和java解密代码兼容
  return ciphertext.hex().upper()

if __name__ =='__main__':
    key = os.urandom(32)
    ciphertext = encrypt(key, b"a secret message!")
    print(ciphertext)

以上代码仅作参考,更多详细内容可移至此处学习:https://cryptography.io/en/latest/hazmat/primitives/symmetric-encryption/#cryptography.hazmat.primitives.ciphers.modes.GCM

你可能感兴趣的:(【python】Python中使用GCM加密模式)