python之pycryptodome模块,加密算法库
一、简介
PyCryptodome是PyCrypto库的一个分支,它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现,包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能,如密码学安全随机数生成、密码学文件格式的支持等。PyCryptodome的设计目标是提供高性能和可移植性。
如果你需要更高的性能和可移植性,那么PyCryptodome可能更适合你。如果你注重安全性和易用性,并且希望遵循最佳实践,那么Cryptography可能是一个不错的选择。
二、安装
pip install pycryptodome
三、pycryptodome之Crypto.Cipher
提供了对称加密算法的实现。可以使用其中的类来创建加密器和解密器,支持常见的对称加密算法,如AES、DES、Triple DES等。
- Crypto.Cipher.AES:对称加密算法,支持不同的密钥长度(128位、192位和256位)。它是目前广泛使用的加密算法之一。
- AES.new(key, mode, use_aesni):创建一个AES加密器/解密器对象
'''
key:表示用于加密和解密的密钥。它应该是一个字节串(bytes)类型,长度可以是16、24或32字节,对应于AES-128、AES-192和AES-256的密钥长度。
mode:表示加密模式。它应该是AES.MODE_XXX常量之一,如AES.MODE_ECB、AES.MODE_CBC等。
use_aesni:一个布尔值,表示是否使用AES-NI硬件指令集加速加密和解密操作。默认值为True。
'''
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpadkey = get_random_bytes(16)# 生成随机的16字节密钥plaintext = b'Hello, world!' #加密数据cipher = AES.new(key, AES.MODE_ECB) # 创建 AES 加密器对象
padded_plaintext = pad(plaintext, AES.block_size) # 填充明文数据ciphertext = cipher.encrypt(padded_plaintext)# 加密decrypted = cipher.decrypt(ciphertext)# 解密
decrypted_data = unpad(decrypted, AES.block_size)# 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- AES.block_size:表示AES算法的块大小(以字节为单位),通常为16字节。
- AES.key_size:表示AES算法支持的密钥长度(以字节为单位),可以是16、24或32字节。
- AES.Buffer:表示用于加密和解密操作的缓冲区大小(以字节为单位)。
- AES.MODE_ECB:电子密码本模式,将每个明文块独立地加密成相应的密文块。ECB模式不提供加密的完全安全性,因为相同的明文块将始终加密成相同的密文块。
- AES.MODE_CBC:在CBC模式中,每个明文块会与前一个密文块进行异或操作,然后再进行加密。需要一个初始向量(IV)来开始加密过程。
- AES.MODE_CCM:CCM模式是一种组合模式,它将CTR模式和CBC-MAC(密码分组链接消息认证码)组合在一起。它提供了加密、解密和消息完整性验证的功能。
- AES.MODE_CFB:CFB模式将前一个密文块作为密钥流的一部分,然后与明文进行异或操作,产生密文。类似于CBC模式,需要一个初始向量(IV)。
- AES.MODE_CTR:CTR模式中,明文与一个计数器进行异或操作,生成密文。计数器可以是递增的,也可以是随机的,只要在加密和解密过程中保持一致即可。
- AES.MODE_EAX:EAX模式是一种组合模式,它将CTR模式和CMAC(密码分组链接消息认证码)组合在一起。它提供了加密、解密和消息完整性验证的功能。
- AES.MODE_GCM:GCM模式是一种组合模式,它将CTR模式和GMAC(Galois消息认证码)组合在一起。它提供了加密、解密和消息完整性验证的功能。
- AES.MODE_OCB:OCB模式是一种组合模式,它将CTR模式和CMAC组合在一起,并引入了一种效率更高的计算方式。它提供了加密、解密和消息完整性验证的功能。
- AES.MODE_OFB:OFB模式将前一个密文块作为密钥流的一部分,然后与明文进行异或操作,产生密文。类似于CFB模式,不需要初始向量(IV)。
- AES.MODE_OPENPGP):OpenPGP模式是一种扩展的加密模式,用于与OpenPGP协议兼容的系统。
- AES.MODE_SIV:SIV模式是一种认证加密模式,它提供了加密、解密和消息完整性验证的功能,并允许使用相同的密钥对多个消息进行加密,而不会泄漏关于明文的信息。
- Crypto.Cipher.ARC2:对称加密算法,密钥长度可变,通常为40位。它是一种较旧的加密算法,现在很少使用。
- ARC2.new(key,mode,iv,IV,nonce,segment_size,mac_len, initial_value,counter):创建一个ARC2加密器/解密器对象
'''
key:ARC2 加密算法使用的密钥。它应该是一个字节字符串,并且长度必须在 1 到 128 字节之间(包括边界值)。
mode:指定 ARC2 加密模式。可以使用以下常量之一:
iv或IV:初始化向量 (Initialization Vector),用于在加密过程中引入随机性。它应该是一个字节字符串,并且长度必须与算法的块大小相同。在某些模式下,如 ECB 模式,iv 参数可以被忽略。
nonce:用于计数器模式的随机数。它应该是一个字节字符串,并且长度必须与算法的块大小相同。
segment_size:在 CFB 模式中,指定数据分段的大小(以位为单位)。默认值为 8。
mac_len:在 EAX 模式中,指定消息认证码 (MAC) 的长度(以字节为单位)。默认值为 16。
initial_value:在计数器模式中,指定初始计数器值。它应该是一个整数。默认值为 0。
counter:在计数器模式中,指定计数器对象。它应该是一个 Crypto.Util.Counter 类的实例。
'''
from Crypto.Cipher import ARC2
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad,unpadkey = get_random_bytes(16) # 生成随机密钥
plaintext = b"Hello, world!" # 要加密的数据cipher = ARC2.new(key, ARC2.MODE_CBC) # 创建 ARC2 加密器对象
padded_data = pad(plaintext, cipher.block_size) # 对数据进行填充
ciphertext = cipher.encrypt(padded_data) # 加密数据decipher = ARC2.new(key, ARC2.MODE_CBC,cipher.iv) # 创建 ARC2 加密器对象
decrypted = decipher.decrypt(ciphertext) # 解密数据
decrypted_data = unpad(decrypted, cipher.block_size) # 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- ARC2.block_size:ARC2 算法的块大小,以字节为单位。在 pycryptodome 中,ARC2 的块大小为 8 字节。
- ARC2.key_size:ARC2 算法支持的密钥长度,以字节为单位。在 pycryptodome 中,ARC2 的密钥长度可以在 1 到 128 字节之间。
- ARC2.Buffer:在 pycryptodome 中,ARC2 加密器对象的内部缓冲区。
- ARC2.MODE_ECB:电子密码本模式。在 ECB 模式下,每个块独立地进行加密或解密,没有引入随机性。
- ARC2.MODE_CBC:密码分组链接模式 。在 CBC 模式下,每个块的加密依赖于前一个块的密文,引入了随机性。
- ARC2.MODE_CFB:密码反馈模式 。在 CFB 模式下,每个块的加密依赖于前一个块的密文和密钥流,引入了随机性。
- ARC2.MODE_OFB:输出反馈模式。在 OFB 模式下,每个块的加密依赖于前一个块的密钥流,引入了随ChaCha20机性。
- ARC2.MODE_CTR:计数器模式。在 CTR 模式下,每个块的加密依赖于计数器值和密钥流,引入了随机性。
- ARC2.MODE_OPENPGP:OpenPGP 模式。在 OpenPGP 模式下,使用了特定的密钥派生函数和密钥流生成算法。
- ARC2.MODE_EAX:EAX 模式。EAX 是一种认证加密模式,同时提供加密和认证功能。
- Crypto.Cipher.ARC4:对称加密算法,也被称为RC4。它是一种流密码算法,密钥长度可变。它简单高效,但由于一些安全性问题,现在不推荐使用。
- ARC4.new(key,drop):创建一个ARC4加密器/解密器对象
'''
key:表示要使用的密钥。密钥是一个字节串(bytes),长度可以根据需要进行调整。通常情况下,密钥的长度应该与算法要求的密钥长度相匹配。
drop:表示在生成初始密钥流之前要丢弃的初始字节数。这个参数是可选的,默认值为 0。在某些应用中,可以选择在开始加密之前丢弃一些初始字节,以增加密钥流的随机性。
'''
from Crypto.Cipher import ARC4
from Crypto.Random import get_random_byteskey = get_random_bytes(16) # 生成随机密钥
plaintext = b"Hello, world!" # 要加密的数据cipher = ARC4.new(key) # 创建 ARC4 加密器对象
ciphertext = cipher.encrypt(plaintext) # 加密数据decipher = ARC4.new(key) # 创建 ARC4 解密器对象
decrypted_data = decipher.decrypt(ciphertext) # 解密数据print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- ARC4.block_size:加密算法的块大小。对于 RC4 算法而言,它是一个流密码算法,没有固定的块大小,因此 block_size 的值为 1。
- ARC4.key_size:加密算法支持的密钥长度。对于 RC4 算法而言,密钥可以是任意长度的字节串,因此 key_size 的值为可变的,没有固定的长度限制。
- ARC4.Buffer:RC4 算法内部使用的缓冲区大小。在 pycryptodome 中,这个值默认为 4096。当加密器对象的缓冲区中的数据被消耗完之后,会自动重新生成新的密钥流并填充缓冲区。
- Crypto.Cipher.Blowfish:对称加密算法,密钥长度可变。它是一种快速且安全的加密算法,适用于各种应用场景。
- Blowfish.new(key,mode,iv,IV,nonce,segment_size,mac_len ,initial_value,counter) :创建一个Blowfish加密器/解密器对象
'''
key:表示要使用的密钥。密钥是一个字节串(bytes),长度可以根据需要进行调整。Blowfish 算法支持的密钥长度可以是 8 到 448 位之间的任意长度。
mode:表示加密模式。这个参数是可选的,默认值为 MODE_ECB,表示使用电子密码本模式。其他可选的模式包括 MODE_CBC(密码分组链接模式)和 MODE_CFB(密码反馈模式)等。
iv 或 IV:表示初始化向量。这个参数是可选的,用于在加密过程中增加随机性。对于 ECB 模式,不需要提供初始化向量;对于其他模式,通常需要提供一个与块大小相匹配的初始化向量。
nonce:表示使用的随机数。这个参数是可选的,用于在加密过程中增加随机性。通常与 CTR 模式一起使用。
segment_size:表示 CFB 模式中的分段大小。这个参数是可选的,默认值为 8。在 CFB 模式中,明文被分成固定大小的分段进行加密。
mac_len:表示消息认证码的长度。这个参数是可选的,默认值为 None,表示不使用消息认证码。
initial_value:表示初始值。这个参数是可选的,用于在某些模式下设置初始值。
counter:表示计数器的初始值。这个参数是可选的,用于在 CTR 模式下设置计数器的初始值。
'''
from Crypto.Cipher import Blowfish
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpadkey = get_random_bytes(16) # 生成随机密钥
plaintext = b"Hello, World!" # 要加密的明文# 创建 Blowfish 加密器对象,使用 CBC 模式和随机的初始化向量
cipher = Blowfish.new(key, mode=Blowfish.MODE_CBC, iv=get_random_bytes(8))
padded_plaintext = pad(plaintext, cipher.block_size) # 填充明文数据
ciphertext = cipher.encrypt(padded_plaintext) # 加密明文decipher = Blowfish.new(key, mode=Blowfish.MODE_CBC, iv=cipher.iv) # 创建 Blowfish 加密器对象
decrypted = decipher.decrypt(ciphertext) # 解密数据
decrypted_data = unpad(decrypted, cipher.block_size) # 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- Blowfish.block_size:Blowfish 算法的分组大小(以字节为单位)。对于 Blowfish 算法,分组大小固定为 8 字节。
- Blowfish.Buffer:Blowfish 加密器对象的内部缓冲区的大小(以字节为单位)。在 pycryptodome 中,默认的缓冲区大小为 4096 字节。
- Blowfish.key_size:Blowfish 算法支持的密钥长度(以位为单位)。对于 Blowfish 算法,密钥长度可以是 32 到 448 位之间的任意长度。
- Blowfish.MODE_CBC:Blowfish 加密算法的密码分组链接模式。在该模式下,每个明文分组在加密之前会与前一个密文分组进行异或运算。
- Blowfish.MODE_CFB:Blowfish 加密算法的密码反馈模式。在该模式下,明文分组的一部分会被加密,然后与明文分组的下一部分进行异或运算。
- Blowfish.MODE_CTR:Blowfish 加密算法的计数器模式。在该模式下,明文分组会与计数器进行加密,计数器的值会根据分组的索引逐渐递增。
- Blowfish.MODE_EAX:Blowfish 加密算法的 EAX 模式。在该模式下,可以同时进行加密和消息认证,并提供附加数据的完整性验证。
- Blowfish.MODE_OFB:Blowfish 加密算法的输出反馈模式。在该模式下,密钥流会被生成并与明文分组进行异或运算,然后输出密文。
- Blowfish.MODE_OPENPGP:Blowfish 加密算法的 OpenPGP 模式。该模式与 CFB 模式类似,但使用了不同的填充和反馈函数。
- Blowfish.MODE_ECB:Blowfish 加密算法的电子密码本模式。在该模式下,每个明文分组都会独立地进行加密。
- Crypto.Cipher.CAST:对称加密算法,密钥长度可变。它是一种安全性较高的加密算法,适用于各种应用场景。
- CAST.new(key,mode,iv,IV,nonce,segment_size,mac_len ,initial_value,counter):创建一个CAST加密器/解密器对象
'''
key:要使用的密钥。密钥是一个字节串(bytes),长度可以是 5 到 16 字节之间的任意长度。
mode:加密模式。可以使用以下常量来指定加密模式:
iv 或 IV:初始化向量(Initialization Vector)。初始化向量是一个字节串(bytes),长度固定为 8 字节。在某些加密模式下,如 CBC、CFB 和 OFB,需要提供一个初始化向量。
nonce:使用的随机数。这个参数是一个字节串(bytes),长度通常为 8 字节。在 CTR 模式下,需要提供一个随机的 nonce。
segment_size:分段大小(以字节为单位)。在 CFB 模式下,可以指定分段大小,取值范围为 1 到 8 之间的整数。
mac_len:消息认证码的长度(以字节为单位)。在 CCM 和 EAX 模式下,可以指定消息认证码的长度。
initial_value:初始值。在 CTR 模式下,可以指定初始值。
counter:计数器的初始值。在 CTR 模式下,可以指定计数器的初始值。
'''
from Crypto.Cipher import CAST
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpadkey = get_random_bytes(16) # 生成随机密钥
plaintext = b"Hello, World!" # 要加密的明文# 创建 CAST 加密器对象,使用 CBC 模式和随机的初始化向量
cipher = CAST.new(key, mode=CAST.MODE_CBC, iv=get_random_bytes(8))
padded_plaintext = pad(plaintext, cipher.block_size) # 填充明文数据
ciphertext = cipher.encrypt(padded_plaintext) # 加密明文decipher = CAST.new(key, mode=CAST.MODE_CBC, iv=cipher.iv) # 创建 CAST 加密器对象
decrypted = decipher.decrypt(ciphertext) # 解密数据
decrypted_data = unpad(decrypted, cipher.block_size) # 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- CAST.block_size:CAST 算法的分组大小(以字节为单位)。对于 CAST 算法,分组大小固定为 8 字节。
- CAST.key_size:CAST 算法支持的密钥长度(以位为单位)。对于 CAST 算法,密钥长度可以是 40 位到 128 位之间的任意长度。
- CAST.Buffer:CAST 加密器对象的内部缓冲区的大小(以字节为单位)。在 pycryptodome 中,默认的缓冲区大小为 4096 字节。
- CAST.MODE_CBC:CAST 加密算法的密码分组链接模式。在该模式下,每个明文分组在加密之前会与前一个密文分组进行异或运算。
- CAST.MODE_ECB:CAST 加密算法的电子密码本模式。在该模式下,每个明文分组都会独立地进行加密。
- CAST.MODE_OPENPGP:CAST 加密算法的 OpenPGP 模式。该模式与 CFB 模式类似,但使用了不同的填充和反馈函数。
- CAST.MODE_OFB:CAST 加密算法的输出反馈模式。在该模式下,密钥流会被生成并与明文分组进行异或运算,然后输出密文。
- CAST.MODE_EAX:CAST 加密算法的 EAX 模式。在该模式下,可以同时进行加密和消息认证,并提供附加数据的完整性验证。
- CAST.MODE_CTR:CAST 加密算法的计数器模式。在该模式下,明文分组会与计数器进行加密,计数器的值会根据分组的索引逐渐递增。
- CAST.MODE_CFB:CAST 加密算法的密码反馈模式。在该模式下,明文分组的一部分会被加密,然后与明文分组的下一部分进行异或运算。
- Crypto.Cipher.ChaCha20:对称加密算法,密钥长度为256位。它是一种高速的加密算法,适用于资源受限的环境。
- ChaCha20.new(key,nonce):创建一个ChaCha20加密器/解密器对象
'''
key:要使用的密钥。密钥是一个字节串(bytes),长度固定为 32 字节。
nonce:使用的随机数。这个参数是一个字节串(bytes),长度可以是 8 字节或 12 字节。
'''
from Crypto.Cipher import ChaCha20
from Crypto.Random import get_random_bytes# 生成随机密钥和随机 nonce
key = get_random_bytes(32)
nonce = get_random_bytes(12)cipher = ChaCha20.new(key=key, nonce=nonce)# 创建 ChaCha20 加密器对象
plaintext = b"Hello, World!"# 要加密的明文
ciphertext = cipher.encrypt(plaintext) # 加密明文decrypt_cipher = ChaCha20.new(key=key, nonce=nonce) # 创建新的 ChaCha20 加密器对象,使用相同的密钥和 nonce
decrypted_data = decrypt_cipher.decrypt(ciphertext) # 解密密文print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- ChaCha20.block_size:ChaCha20 算法的分组大小(以字节为单位)。对于 ChaCha20 算法,分组大小固定为 64 字节。
- ChaCha20.key_size:ChaCha20 算法支持的密钥长度(以位为单位)。对于 ChaCha20 算法,密钥长度固定为 256 位。
- ChaCha20.Buffer:ChaCha20 加密器对象的内部缓冲区的大小(以字节为单位)。在 pycryptodome 中,默认的缓冲区大小为 4096 字节
7.Crypto.Cipher.ChaCha20_Poly1305:对称加密算法,结合了ChaCha20和Poly1305消息认证码。它提供了高速的加密和完整性保护。 - ChaCha20_Poly1305.new(key,nonce):创建一个ChaCha20_Poly1305加密器/解密器对象
'''
key:要使用的密钥。密钥是一个字节串(bytes),长度固定为 32 字节。
nonce:使用的随机数。这个参数是一个字节串(bytes),长度可以是 8 字节或 12 字节。
'''
from Crypto.Cipher import ChaCha20_Poly1305
from Crypto.Random import get_random_bytes# 生成随机密钥和随机 nonce
key = get_random_bytes(32)
nonce = get_random_bytes(12)cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce)# 创建 ChaCha20 加密器对象
plaintext = b"Hello, World!"# 要加密的明文
ciphertext = cipher.encrypt(plaintext) # 加密明文decrypt_cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) # 创建新的 ChaCha20 加密器对象,使用相同的密钥和 nonce
decrypted_data = decrypt_cipher.decrypt(ciphertext) # 解密密文print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- ChaCha20_Poly1305.block_size:ChaCha20_Poly1305 算法的分组大小(以字节为单位)。对于 ChaCha20_Poly1305 算法,分组大小固定为 64 字节。
- ChaCha20_Poly1305.key_size:ChaCha20_Poly1305 算法支持的密钥长度(以位为单位)。对于 ChaCha20_Poly1305 算法,密钥长度固定为 256 位。
- ChaCha20_Poly1305.Buffer:ChaCha20_Poly1305 加密器对象的内部缓冲区的大小(以字节为单位)。在 pycryptodome 中,默认的缓冲区大小为 4096 字节。
- Crypto.Cipher.DES:对称加密算法,密钥长度为56位。它是一种较旧的加密算法,现在不推荐使用。
- DES.new(key,mode,iv,IV,nonce,segment_size,mac_len ,initial_value,counter):创建一个DES加密器/解密器对象
'''
key:要使用的密钥。密钥是一个字节串(bytes),长度固定为 8 字节。
mode:加密模式。可以使用以下常量来指定加密模式:
iv 或 IV:初始化向量(Initialization Vector)。初始化向量是一个字节串(bytes),长度固定为 8 字节。在某些加密模式下,如 CBC、CFB 和 OFB,需要提供一个初始化向量。
nonce:使用的随机数。这个参数是一个字节串(bytes),长度通常为 8 字节。在 CTR 模式下,需要提供一个随机的 nonce。
segment_size:分段大小(以字节为单位)。在 CFB 模式下,可以指定分段大小,取值范围为 1 到 8 之间的整数。
mac_len:消息认证码的长度(以字节为单位)。在 CCM 和 EAX 模式下,可以指定消息认证码的长度。
initial_value:初始值。在 CTR 模式下,可以指定初始值。
counter:计数器的初始值。在 CTR 模式下,可以指定计数器的初始值
'''
from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpadkey = get_random_bytes(8) # 生成随机的8字节密钥plaintext = b'Hello, world!' # 加密数据cipher = DES.new(key, DES.MODE_ECB) # 创建 DES 加密器对象
padded_plaintext = pad(plaintext, DES.block_size) # 填充明文数据ciphertext = cipher.encrypt(padded_plaintext) # 加密decrypted = cipher.decrypt(ciphertext) # 解密
decrypted_data = unpad(decrypted, DES.block_size) # 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- DES.key_size:DES 加密算法支持的密钥大小(以位为单位)。在 DES 中,密钥大小固定为 56 位。
- DES.block_size:DES 加密算法的分组大小(以字节为单位)。在 DES 中,分组大小固定为 8 字节。
- DES.MODE_ECB:DES 加密算法的电子密码本模式(Electronic Codebook)。在 ECB 模式下,每个分组都独立地进行加密,相同的明文分组将得到相同的密文分组。
- DES.MODE_CFB:DES 加密算法的密码反馈模式(Cipher Feedback)。在 CFB 模式下,前一个密文分组被反馈给加密器,用于生成下一个密文分组。
- DES.MODE_CTR:DES 加密算法的计数器模式(Counter)。在 CTR 模式下,每个分组都使用一个唯一的计数器值进行加密,计数器值通过加密器生成。
- DES.MODE_EAX:DES 加密算法的 EAX 模式。EAX 模式提供了加密、认证和扩展性。
- DES.MODE_OFB:DES 加密算法的输出反馈模式(Output Feedback)。在 OFB 模式下,前一个密文分组被反馈给加密器,用于生成密钥流,然后与明文进行异或运算得到密文。
- DES.MODE_OPENPGP:DES 加密算法的 OpenPGP 模式。
- DES.MODE_CBC:DES 加密算法的密码分组链接模式(Cipher Block Chaining)。在 CBC 模式下,每个明文分组先与前一个密文分组进行异或运算,然后再进行加密。
- Crypto.Cipher.DES3:对称加密算法,也被称为Triple DES。密钥长度为168位,由3个56位的子密钥组成。它提供了较高的安全性,但速度较慢。
- DES3.new(key,mode,iv,IV,nonce,segment_size,mac_len ,initial_value,counter):创建一个DES3加密器/解密器对象
'''
key:表示要使用的密钥。密钥是一个字节串(bytes),长度必须为 16 或 24 字节。
mode:表示加密模式。可以使用以下常量进行指定:
iv 或 IV:表示初始化向量。这个参数是一个字节串(bytes),长度必须为 8 字节。
nonce:表示使用的随机数。这个参数是一个字节串(bytes),长度必须为 8 字节。
segment_size:表示用于 CFB 模式的分段大小(以位为单位)。默认值为 8。
mac_len:表示 EAX 模式中认证标签的长度(以字节为单位)。默认值为 8。
initial_value:表示 CTR 模式中初始计数器值。这个参数是一个整数,默认值为 0。
'''
from Crypto.Cipher import DES3
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpadkey = get_random_bytes(24) # 生成随机的8字节密钥plaintext = b'Hello, world!' # 加密数据cipher = DES3.new(key, DES3.MODE_ECB) # 创建 DES3 加密器对象
padded_plaintext = pad(plaintext, cipher.block_size) # 填充明文数据ciphertext = cipher.encrypt(padded_plaintext) # 加密decrypt_cipher = DES3.new(key, DES3.MODE_ECB) # 创建新的 DES3 加密器对象
decrypted = decrypt_cipher.decrypt(ciphertext) # 解密
decrypted_data = unpad(decrypted, cipher.block_size) # 去除填充print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted_data)
- DES3.block_size:DES3 加密算法的分组大小(以字节为单位)。在 DES3 中,分组大小固定为 8 字节。
- DES3.key_size:DES3 加密算法支持的密钥大小(以位为单位)。在 DES3 中,密钥大小可以是 128 位(16 字节)或 192 位(24 字节)。
- DES3.Buffer:DES3 加密算法的缓冲区大小(以字节为单位)。
- DES3.MODE_CBC:DES3 加密算法的密码分组链接模式(Cipher Block Chaining)。在 CBC 模式下,每个明文分组先与前一个密文分组进行异或运算,然后再进行加密。
- DES3.MODE_ECB:DES3 加密算法的电子密码本模式(Electronic Codebook)。在 ECB 模式下,每个分组都独立地进行加密,相同的明文分组将得到相同的密文分组。
- DES3.MODE_OPENPGP:DES3 加密算法的 OpenPGP 模式。
- DES3.MODE_OFB:DES3 加密算法的输出反馈模式(Output Feedback)。在 OFB 模式下,前一个密文分组被反馈给加密器,用于生成密钥流,然后与明文进行异或运算得到密文。
- DES3.MODE_EAX:DES3 加密算法的 EAX 模式。EAX 模式提供了加密、认证和扩展性。
- DES3.MODE_CTR:DES3 加密算法的计数器模式(Counter)。在 CTR 模式下,每个分组都使用一个唯一的计数器值进行加密,计数器值通过加密器生成。
- DES3.MODE_CFB:DES3 加密算法的密码反馈模式(Cipher Feedback)。在 CFB 模式下,前一个密文分组被反馈给加密器,用于生成下一个密文分组。
- DES3.adjust_key_parity(key_in):用于调整密钥的奇偶校验位,确保密钥的正确性。
- Crypto.Cipher.PKCS1_OAEP:非对称加密算法,使用OAEP(Optimal Asymmetric Encryption Padding)填充方案。它用于加密和解密数据,通常与RSA密钥一起使用。
- PKCS1_OAEP.new(key,hashAlgo,mgfunc,label,randfunc):创建一个PKCS1_OAEP加密器/解密器对象
'''
key:RSA 密钥对象(公钥或私钥)。
hashAlgo:哈希算法,用于计算散列值。可以使用 Crypto.Hash 模块中的哈希算法,例如 Crypto.Hash.SHA256。
mgfunc:掩码生成函数(Mask Generation Function),用于生成掩码以进行填充。默认为 None,表示使用标准的 MGF1。
label:可选参数,用于标识消息的标签。默认为 b''。
randfunc:可选参数,用于生成随机数。默认为 None,表示使用 Crypto.Random 模块中的默认随机数生成器。
'''
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256key = RSA.generate(2048) # 生成 RSA 密钥对
plaintext = b'Hello, world!' # 加密数据cipher = PKCS1_OAEP.new(key, hashAlgo=SHA256) # 创建 PKCS1_OAEP 加密器对象
ciphertext = cipher.encrypt(plaintext) # 加密decrypt_cipher = PKCS1_OAEP.new(key, hashAlgo=SHA256) # 创建 PKCS1_OAEP 加密器对象
decrypted = decrypt_cipher.decrypt(ciphertext) # 解密print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted)
- PKCS1_OAEP.Buffer 一个字节串(bytes)类型的缓冲区。在使用 PKCS1_OAEP 加密器和解密器对象时,可以将其用作密钥、明文和密文的参数类型。
- PKCS1_OAEP.HashLike 一个类似于哈希对象的类型。在使用 PKCS1_OAEP 加密器和解密器对象时,可以将其用作哈希算法的参数类型。
- Crypto.Cipher.PKCS1_v1_5:非对称加密算法,使用PKCS#1 v1.5填充方案。它用于加密和解密数据,通常与RSA密钥一起使用。
- PKCS1_v1_5.new(key,randfunc):创建一个PKCS1_v1_5加密器/解密器对象
'''
key:RSA 密钥对象,可以是公钥或私钥。这个密钥对象用于进行加密或解密操作。
randfunc:一个可调用对象,用于生成随机数。如果提供了 randfunc,它将被用于生成加密过程中需要的随机字节。如果未提供 randfunc,则会使用默认的随机数生成器
'''
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5key = RSA.generate(2048) # 生成 RSA 密钥对
plaintext = b'Hello, world!' # 加密数据cipher = PKCS1_v1_5.new(key) # 创建 PKCS1_v1_5 加密器对象
ciphertext = cipher.encrypt(plaintext) # 加密decrypt_cipher = PKCS1_v1_5.new(key) # 创建 PKCS1_v1_5 加密器对象
decrypted = decrypt_cipher.decrypt(ciphertext, None) # 解密print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted)
- PKCS1_v1_5.Buffer 一个字节串(bytes)类型的缓冲区。在使用 PKCS1_v1_5 加密器和解密器对象时,可以将其用作明文和密文的参数类型。
- Crypto.Cipher.Salsa20:对称加密算法,密钥长度为256位。它是一种高速的加密算法,适用于资源受限的环境。
- Salsa20.new(key,nonce):创建一个Salsa20加密器/解密器对象
'''
key:Salsa20 密钥,一个字节串(bytes)类型的密钥。密钥长度可以是 16 字节(128 位)或 32 字节(256 位)。
nonce:Salsa20 随机数,一个字节串(bytes)类型的随机数。它用于与密钥一起生成加密流。
'''from Crypto.Cipher import Salsa20key = b'0123456789abcdef' # 16 字节密钥
nonce = b'87654321' # 8 字节随机数plaintext = b'Hello, world!'# 明文数据cipher = Salsa20.new(key,nonce) # 创建 Salsa20 加密器对象
ciphertext = cipher.encrypt(plaintext) # 加密decrypt_cipher = Salsa20.new(key,nonce) # 创建 Salsa20 加密器对象
decrypted = decrypt_cipher.decrypt(ciphertext) # 解密print('原始数据:', plaintext)
print('加密后:', ciphertext.hex())
print('解密后:', decrypted)
- Salsa20.Buffer:一个字节串(bytes)类型的缓冲区。它用于描述 Salsa20 加密器和解密器对象的参数类型。
- Salsa20.key_size:Salsa20 密钥的长度,单位为字节。在 pycryptodome 中,Salsa20 密钥长度可以是 16 字节(128 位)或 32 字节(256 位)。
- Salsa20.block_size:Salsa20 加密算法的块大小,单位为字节。在 pycryptodome 中,Salsa20 的块大小固定为 64 字节。
四、pycryptodome之Crypto.Hash
提供了哈希函数的实现。可以使用其中的类来计算消息的哈希值,支持常见的哈希算法,如MD5、SHA-1、SHA-256等。
1.Crypto.Hash.MD2:MD2哈希算法
- MD2.Buffer:表示 MD2 哈希函数的缓冲区大小。
- MD2.block_size:表示 MD2 哈希函数的输入块大小,即每次处理的数据块大小。
- MD2.digest_size:表示 MD2 哈希函数的输出摘要的字节大小。
- MD2.new(data=None):用于创建一个新的 MD2 哈希对象
from Crypto.Hash import MD2data = 'hello word'.encode('utf-8')md2 = MD2.new(data)print('十六进制哈希值:',md2.hexdigest())
print('十六字节哈希值:',md2.digest())
print('哈希算法的分块大小:',md2.block_size)
print('哈希算法的哈希值大小:',md2.digest_size)
print('拷贝当前哈希对象:',md2.copy())md2.update('hello'.encode('utf-8'))print('十六进制哈希值:',md2.hexdigest())
- Crypto.Hash.MD4:MD4哈希算法
- MD4.Buffer:表示 MD4 哈希函数的缓冲区大小。
- MD4.block_size:表示 MD4 哈希函数的输入块大小,即每次处理的数据块大小。
- MD4.digest_size:表示 MD4 哈希函数的输出摘要的字节大小。
- MD4.new(data=None):用于创建一个新的 MD4 哈希对象
from Crypto.Hash import MD4data = 'hello word'.encode('utf-8')md4 = MD4.new(data)print('十六进制哈希值:',md4.hexdigest())
print('十六字节哈希值:',md4.digest())
print('哈希算法的分块大小:',md4.block_size)
print('哈希算法的哈希值大小:',md4.digest_size)
print('拷贝当前哈希对象:',md4.copy())md4.update('hello'.encode('utf-8'))print('十六进制哈希值:',md4.hexdigest())
- Crypto.Hash.MD5:MD5哈希算法
- MD5.Buffer:表示 MD5 哈希函数的缓冲区大小。
- MD5.block_size:表示 MD5 哈希函数的输入块大小,即每次处理的数据块大小。
- MD5.digest_size:表示 MD5 哈希函数的输出摘要的字节大小。
- MD5.new(data=None):用于创建一个新的 MD5 哈希对象
from Crypto.Hash import MD5data = 'hello word'.encode('utf-8')md5 = MD5.new(data)print('十六进制哈希值:',md5.hexdigest())
print('十六字节哈希值:',md5.digest())
print('哈希算法的分块大小:',md5.block_size)
print('哈希算法的哈希值大小:',md5.digest_size)
print('拷贝当前哈希对象:',md5.copy())md5.update('hello'.encode('utf-8'))print('十六进制哈希值:',md5.hexdigest())
- Crypto.Hash.SHA256:SHA256哈希算法
- SHA256.Buffer:表示 SHA256 哈希函数的缓冲区大小。
- SHA256.block_size:表示 SHA256 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA256.digest_size:表示 SHA256 哈希函数的输出摘要的字节大小。
- SHA256.new(data=None):用于创建一个新的 SHA256 哈希对象
from Crypto.Hash import SHA256data = 'hello word'.encode('utf-8')sha256 = SHA256.new(data)print('十六进制哈希值:',sha256.hexdigest())
print('十六字节哈希值:',sha256.digest())
print('哈希算法的分块大小:',sha256.block_size)
print('哈希算法的哈希值大小:',sha256.digest_size)
print('拷贝当前哈希对象:',sha256.copy())sha256.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha256.hexdigest())
- Crypto.Hash.SHA1:SHA1哈希算法
- SHA1.Buffer:表示 SHA1 哈希函数的缓冲区大小。
- SHA1.block_size:表示 SHA1 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA1.digest_size:表示 SHA1 哈希函数的输出摘要的字节大小。
- SHA1.new(data=None):用于创建一个新的 SHA1 哈希对象
from Crypto.Hash import SHA1data = 'hello word'.encode('utf-8')sha1 = SHA1.new(data)print('十六进制哈希值:',sha1.hexdigest())
print('十六字节哈希值:',sha1.digest())
print('哈希算法的分块大小:',sha1.block_size)
print('哈希算法的哈希值大小:',sha1.digest_size)
print('拷贝当前哈希对象:',sha1.copy())sha1.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha1.hexdigest())
- Crypto.Hash.SHA224:SHA224哈希算法
- SHA224.Buffer:表示 SHA224 哈希函数的缓冲区大小。
- SHA224.block_size:表示 SHA224 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA224.digest_size:表示 SHA224 哈希函数的输出摘要的字节大小。
- SHA224.new(data=None):用于创建一个新的 SHA224 哈希对象
from Crypto.Hash import SHA224data = 'hello word'.encode('utf-8')sha224 = SHA224.new(data)print('十六进制哈希值:',sha224.hexdigest())
print('十六字节哈希值:',sha224.digest())
print('哈希算法的分块大小:',sha224.block_size)
print('哈希算法的哈希值大小:',sha224.digest_size)
print('拷贝当前哈希对象:',sha224.copy())sha224.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha224.hexdigest())
- Crypto.Hash.SHA384:SHA384哈希算法
- SHA384.Buffer:表示 SHA384 哈希函数的缓冲区大小。
- SHA384.block_size:表示 SHA384 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA384.digest_size:表示 SHA384 哈希函数的输出摘要的字节大小。
- SHA384.new(data=None):用于创建一个新的 SHA384 哈希对象
from Crypto.Hash import SHA384data = 'hello word'.encode('utf-8')sha384 = SHA384.new(data)print('十六进制哈希值:',sha384.hexdigest())
print('十六字节哈希值:',sha384.digest())
print('哈希算法的分块大小:',sha384.block_size)
print('哈希算法的哈希值大小:',sha384.digest_size)
print('拷贝当前哈希对象:',sha384.copy())sha384.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha384.hexdigest())
- Crypto.Hash.SHA512:SHA512哈希算法
- SHA512.Buffer:表示 SHA512 哈希函数的缓冲区大小。
- SHA512.block_size:表示 SHA512 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA512.digest_size:表示 SHA512 哈希函数的输出摘要的字节大小。
- SHA512.new(data=None):用于创建一个新的 SHA512 哈希对象
from Crypto.Hash import SHA512data = 'hello word'.encode('utf-8')sha512 = SHA512.new(data)print('十六进制哈希值:',sha512.hexdigest())
print('十六字节哈希值:',sha512.digest())
print('哈希算法的分块大小:',sha512.block_size)
print('哈希算法的哈希值大小:',sha512.digest_size)
print('拷贝当前哈希对象:',sha512.copy())sha512.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha512.hexdigest())
- Crypto.Hash.SHA3_224:SHA3_224哈希算法
- SHA3_224.Buffer:表示 SHA3_224 哈希函数的缓冲区大小。
- SHA3_224.block_size:表示 SHA3_224 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA3_224.digest_size:表示 SHA3_224 哈希函数的输出摘要的字节大小。
- SHA3_224.new(data=None,update_after_digest):用于创建一个新的 SHA3_224 哈希对象
from Crypto.Hash import SHA3_224data = 'hello word'.encode('utf-8')sha3_224 = SHA3_224.new(data,update_after_digest=True)print('十六进制哈希值:',sha3_224.hexdigest())
print('十六字节哈希值:',sha3_224.digest())
print('哈希算法的分块大小:',sha3_224.block_size)
print('哈希算法的哈希值大小:',sha3_224.digest_size)
print('拷贝当前哈希对象:',sha3_224.copy())sha3_224.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha3_224.hexdigest())
- Crypto.Hash.SHA3_256:SHA3_256哈希算法
- SHA3_256.Buffer:表示 SHA3_256 哈希函数的缓冲区大小。
- SHA3_256.block_size:表示 SHA3_256 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA3_256.digest_size:表示 SHA3_256 哈希函数的输出摘要的字节大小。
- SHA3_256.new(data=None,update_after_digest):用于创建一个新的 SHA3_256 哈希对象
from Crypto.Hash import SHA3_256data = 'hello word'.encode('utf-8')sha3_256 = SHA3_256.new(data,update_after_digest=True)print('十六进制哈希值:',sha3_256.hexdigest())
print('十六字节哈希值:',sha3_256.digest())
print('哈希算法的分块大小:',sha3_256.block_size)
print('哈希算法的哈希值大小:',sha3_256.digest_size)
print('拷贝当前哈希对象:',sha3_256.copy())sha3_256.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha3_256.hexdigest())
- Crypto.Hash.SHA3_384:SHA3_384哈希算法
- SHA3_384.Buffer:表示 SHA3_384 哈希函数的缓冲区大小。
- SHA3_384.block_size:表示 SHA3_384 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA3_384.digest_size:表示 SHA3_384 哈希函数的输出摘要的字节大小。
- SHA3_384.new(data=None,update_after_digest):用于创建一个新的 SHA3_384 哈希对象
from Crypto.Hash import SHA3_384data = 'hello word'.encode('utf-8')sha3_384 = SHA3_384.new(data,update_after_digest=True)print('十六进制哈希值:',sha3_384.hexdigest())
print('十六字节哈希值:',sha3_384.digest())
print('哈希算法的分块大小:',sha3_384.block_size)
print('哈希算法的哈希值大小:',sha3_384.digest_size)
print('拷贝当前哈希对象:',sha3_384.copy())sha3_384.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha3_384.hexdigest())
- Crypto.Hash.SHA3_512:SHA3_512哈希算法
- SHA3_512.Buffer:表示 SHA3_512 哈希函数的缓冲区大小。
- SHA3_512.block_size:表示 SHA3_512 哈希函数的输入块大小,即每次处理的数据块大小。
- SHA3_512.digest_size:表示 SHA3_512 哈希函数的输出摘要的字节大小。
- SHA3_512.new(data=None,update_after_digest):用于创建一个新的 SHA3_512 哈希对象
from Crypto.Hash import SHA3_512data = 'hello word'.encode('utf-8')sha3_512 = SHA3_512.new(data,update_after_digest=True)print('十六进制哈希值:',sha3_512.hexdigest())
print('十六字节哈希值:',sha3_512.digest())
print('哈希算法的分块大小:',sha3_512.block_size)
print('哈希算法的哈希值大小:',sha3_512.digest_size)
print('拷贝当前哈希对象:',sha3_512.copy())sha3_512.update('hello'.encode('utf-8'))print('十六进制哈希值:',sha3_512.hexdigest())
- Crypto.Hash.SHAKE128:SHAKE128哈希算法,SHA-3 衍生的可变长度哈希函数,可以生成不同长度的哈希值
- SHAKE128.Buffer:SHAKE128 哈希函数的缓冲区大小。
- SHAKE128.new(data):创建一个新的 SHAKE128 哈希对象。
from Crypto.Hash import SHAKE128data = b'hello word'shake128 = SHAKE128.new(data)shake128.update(b'hello')print('字节哈希值:', shake128.read(10))
- Crypto.Hash.SHAKE256:SHAKE256哈希算法,SHA-3 衍生的可变长度哈希函数,可以生成不同长度的哈希值
- SHAKE256.Buffer:SHAKE256 哈希函数的缓冲区大小。
- SHAKE256.new(data):创建一个新的 SHAKE256 哈希对象。
from Crypto.Hash import SHAKE256data = b'hello word'shake256 = SHAKE256.new(data)shake256.update(b'hello')print('字节哈希值:', shake256.read(10))
- Crypto.Hash.HMAC:这是基于哈希函数的密钥相关的消息认证码算法。它可以使用不同的哈希算法(如 SHA256、SHA512 等)来计算消息认证码。
- HMAC.Buffer:表示 HMAC 哈希函数的缓冲区大小。
- HMAC.digest_size:表示 HMAC 哈希函数输出的摘要(哈希值)的大小,以字节为单位。
- HMAC.new(key, msg, digestmod):创建一个新的 HMAC 哈希对象
'''
key:密钥
msg:消息
digestmod:哈希算法,常见的哈希算法包括 SHA1、SHA256、SHA512 等。
'''
from Crypto.Hash import HMAC,MD5key = b'my_secret_key'
message = b'Hello, world!'hmac = HMAC.new(key,message,MD5)print('十六进制哈希值:',hmac.hexdigest())
print('十六字节哈希值:',hmac.digest())
print('哈希算法的哈希值大小:',hmac.digest_size)
print('拷贝当前哈希对象:',hmac.copy())
print('验证十六字节哈希值:',hmac.verify(hmac.digest()))
print('验证十六进制哈希值:',hmac.hexverify(hmac.hexdigest()))
- Crypto.Hash.CMAC:这是一种基于对称加密算法的消息认证码算法。它使用一个密钥和一个块加密算法(如 AES)来计算消息认证码。
- CMAC.Buffer:是一个常量,表示 CMAC 算法的缓冲区大小。
- CMAC.digest_size:表示 CMAC 算法输出的摘要(MAC 值)的大小,以字节为单位。
- CMAC.new(key, msg, ciphermod, cipher_params, mac_len, update_after_digest):用于创建一个新的 CMAC 算法对象
'''
key:表示用于计算 CMAC 的密钥,是一个字节串。
msg:表示要计算 CMAC 的消息,也是一个字节串。
ciphermod:表示底层使用的对称加密算法模块,例如 Crypto.Cipher.AES、Crypto.Cipher.DES 等。
cipher_params:表示底层对称加密算法的参数,例如 AES 加密算法的参数可以是一个字节串表示的密钥。
mac_len:表示期望的 MAC 长度,以字节为单位。如果不指定,默认为底层对称加密算法的块大小。
update_after_digest:布尔值,表示在计算完摘要后是否允许继续更新 CMAC 对象。如果为 True,可以继续调用 update() 方法更新 CMAC 对象;如果为 False,在计算完摘要后调用 update() 方法将引发异常。默认为 False。
'''
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Hash import CMACkey = get_random_bytes(16) # 生成随机密钥
plaintext = b"Hello, world!" # 要加密的数据cmac = CMAC.new(key, plaintext, ciphermod=AES, mac_len=8,update_after_digest=True)print('十六进制哈希值:', cmac.hexdigest())
print('十六字节哈希值:', cmac.digest())
print('哈希算法的哈希值大小:', cmac.digest_size)
print('拷贝当前哈希对象:', cmac.copy())
print('验证十六字节哈希值:', cmac.verify(cmac.digest()))
print('验证十六进制哈希值:', cmac.hexverify(cmac.hexdigest()))cmac.update(b'hello')
print('十六进制哈希值:', cmac.hexdigest())
- Crypto.Hash.RIPEMD160:RIPEMD160哈希算法
- RIPEMD160.digest_size:RIPEMD-160 哈希值的字节大小。
- RIPEMD160.block_size:RIPEMD-160 算法的分块大小。
- RIPEMD160.Buffer:RIPEMD-160 哈希值的缓冲区。
- RIPEMD160.new(data=None):创建一个新的 RIPEMD160 哈希对象
from Crypto.Hash import RIPEMD160data = 'hello word'.encode('utf-8')ripemd160 = RIPEMD160.new(data)print('十六进制哈希值:', ripemd160.hexdigest())
print('十六字节哈希值:', ripemd160.digest())
print('哈希算法的分块大小:', ripemd160.block_size)
print('哈希算法的哈希值大小:', ripemd160.digest_size)
print('拷贝当前哈希对象:', ripemd160.copy())ripemd160.update('hello'.encode('utf-8'))print('十六进制哈希值:', ripemd160.hexdigest())
- Crypto.Hash.KMAC128:KMAC128哈希算法
- KMAC128.Buffer: KMAC128 哈希值的缓冲区。
- KMAC128.new(key, data=None, mac_len=None, custom=None):创建一个新的 KMAC128 哈希对象
'''
key:密钥。它是一个字节串(bytes),用于计算哈希值和认证标签。
data:要计算哈希值的数据。它是一个字节串(bytes)。
mac_len:期望的哈希值的长度(以比特为单位)。如果未指定,将使用默认的哈希值长度。
custom:自定义字符串,用于与密钥一起计算哈希值和认证标签。它是一个字节串(bytes)
'''
from Crypto.Hash import KMAC128
from Crypto.Random import get_random_byteskey = get_random_bytes(16) # 密钥
data = b"Hello, world!" # 要计算哈希值的数据
mac_len = 16 # MAC 长度
custom = b"custom_string" # 自定义字符串kmac128 = KMAC128.new(key=key, data=data, mac_len=mac_len, custom=custom)# kmac128.update(b"hello")print('十六进制哈希值:', kmac128.hexdigest())
print('十六字节哈希值:', kmac128.digest())
print('验证十六字节哈希值:', kmac128.verify(kmac128.digest()))
print('验证十六进制哈希值:', kmac128.hexverify(kmac128.hexdigest()))
- Crypto.Hash.KMAC256:这些是基于 Keccak 算法的可变长度哈希函数,可以生成不同长度的哈希值。
- KMAC256.Buffer:KMAC128 哈希值的缓冲区。
- KMAC256.new(key, data=None, mac_len=None, custom=None):创建一个新的 KMAC256 哈希对象
'''
key:密钥。它是一个字节串(bytes),用于计算哈希值和认证标签。
data:要计算哈希值的数据。它是一个字节串(bytes)。
mac_len:期望的哈希值的长度(以比特为单位)。如果未指定,将使用默认的哈希值长度。
custom:自定义字符串,用于与密钥一起计算哈希值和认证标签。它是一个字节串(bytes)
'''
from Crypto.Hash import KMAC256
from Crypto.Random import get_random_byteskey = get_random_bytes(32) # 密钥
data = b"Hello, world!" # 要计算哈希值的数据
mac_len = 32 # MAC 长度
custom = b"custom_string" # 自定义字符串kmac256 = KMAC256.new(key=key, data=data, mac_len=mac_len, custom=custom)# kmac256.update(b"hello")print('十六进制哈希值:', kmac256.hexdigest())
print('十六字节哈希值:', kmac256.digest())
print('验证十六字节哈希值:', kmac256.verify(kmac256.digest()))
print('验证十六进制哈希值:', kmac256.hexverify(kmac256.hexdigest()))
- Crypto.Hash.TupleHash128:基于 Keccak 算法的元组哈希函数,用于将多个输入值组合成单个哈希值
- TupleHash128.Buffer:TupleHash128 哈希值的缓冲区。
- TupleHash128.new(digest_bytes,digest_bits,custom):创建一个新的 TupleHash128 哈希对象
'''
digest_bytes:必要计算哈希值的数据。它是一个字节串(bytes)。
digest_bits:期望的哈希值的长度(以比特为单位)。
custom:自定义字符串,用于计算哈希值。它是一个字节串(bytes)
'''
from Crypto.Hash import TupleHash128custom = b"Hello, world!" # 消息数据tulphash128 = TupleHash128.new(digest_bytes=32,custom=custom)tulphash128.update(b'hello')print('十六进制哈希值:', tulphash128.hexdigest())
print('十六字节哈希值:', tulphash128.digest())
- Crypto.Hash.TupleHash256:这些是基于 Keccak 算法的元组哈希函数,用于将多个输入值组合成单个哈希值。
- TupleHash256.Buffer:TupleHash256 哈希值的缓冲区。
- TupleHash256.new(digest_bytes,digest_bits,custom):创建一个新的 TupleHash256 哈希对象
'''
digest_bytes:必要计算哈希值的数据。它是一个字节串(bytes)。
digest_bits:期望的哈希值的长度(以比特为单位)。
custom:自定义字符串,用于计算哈希值。它是一个字节串(bytes)
'''
from Crypto.Hash import TupleHash256custom = b"Hello, world!" # 消息数据tulphash256 = TupleHash256.new(digest_bytes=32,custom=custom)tulphash256.update(b'hello')print('十六进制哈希值:', tulphash256.hexdigest())
print('十六字节哈希值:', tulphash256.digest())
- Crypto.Hash.BLAKE2s:BLAKE2 系列的哈希函数,提供高速和安全的哈希计算
- BLAKE2s.Buffer:BLAKE2s 哈希值的缓冲区。
- BLAKE2s.new(data,digest_bytesdigest_bitskey,update_after_digest):创建一个新的 BLAKE2s 哈希对象
'''
data:要计算哈希值的数据。它是一个字节串(bytes)。
digest_bytes:期望的哈希值的长度(以字节为单位),默认的哈希值长度(32 字节),与digest_bits参数冲突
digest_bits:期望的哈希值的长度(以比特为单位),默认的哈希值长度(256 比特),与digest_bytes参数冲突
key:用于计算哈希值的密钥。它是一个字节串(bytes)。如果未提供该参数,则不使用密钥进行计算。
update_after_digest:在计算哈希值后是否允许继续更新数据。如果设置为 True,则可以在计算哈希值后继续使用 update() 方法添加更多数据
'''
from Crypto.Hash import BLAKE2s
from Crypto.Random import get_random_byteskey = get_random_bytes(32) # 密钥
data = b"Hello, world!" # 要计算哈希值的数据
digest_bits = 32 # MAC 长度
custom = b"custom_string" # 自定义字符串blake2s = BLAKE2s.new(data=data,digest_bytes=32,key=key,update_after_digest=True)print('十六进制哈希值:', blake2s.hexdigest())
print('十六字节哈希值:', blake2s.digest())
print('验证十六字节哈希值:', blake2s.verify(blake2s.digest()))
print('验证十六进制哈希值:', blake2s.hexverify(blake2s.hexdigest()))blake2s.update(b"hello")
print('十六进制哈希值:', blake2s.hexdigest())
- Crypto.Hash.BLAKE2b:BLAKE2 系列的哈希函数,提供高速和安全的哈希计算
- BLAKE2b.Buffer:BLAKE2b 哈希值的缓冲区。
- BLAKE2b.new(data,digest_bytesdigest_bitskey,update_after_digest):创建一个新的BLAKE2b 哈希对象
'''
data:要计算哈希值的数据。它是一个字节串(bytes)。
digest_bytes:期望的哈希值的长度(以字节为单位),默认的哈希值长度(32 字节),与digest_bits参数冲突
digest_bits:期望的哈希值的长度(以比特为单位),默认的哈希值长度(256 比特),与digest_bytes参数冲突
key:用于计算哈希值的密钥。它是一个字节串(bytes)。如果未提供该参数,则不使用密钥进行计算。
update_after_digest:在计算哈希值后是否允许继续更新数据。如果设置为 True,则可以在计算哈希值后继续使用 update() 方法添加更多数据
'''
from Crypto.Hash import BLAKE2b
from Crypto.Random import get_random_byteskey = get_random_bytes(32) # 密钥
data = b"Hello, world!" # 要计算哈希值的数据
digest_bits = 32 # MAC 长度
custom = b"custom_string" # 自定义字符串blake2b = BLAKE2b.new(data=data,digest_bytes=32,key=key,update_after_digest=True)print('十六进制哈希值:', blake2b.hexdigest())
print('十六字节哈希值:', blake2b.digest())
print('验证十六字节哈希值:', blake2b.verify(blake2b.digest()))
print('验证十六进制哈希值:', blake2b.hexverify(blake2b.hexdigest()))blake2b.update(b"hello")
print('十六进制哈希值:', blake2b.hexdigest())
- Crypto.Hash.KangarooTwelve:这是一种快速的哈希函数,适用于各种应用场景。
- KangarooTwelve.Buffer:KangarooTwelve 哈希值的缓冲区。
'''
data:要计算哈希值的数据。它可以是字节串(bytes)、字节数组(bytearray)或可迭代对象,例如字符串。如果是可迭代对象,它将在计算哈希值之前被转换为字节串。
custom:可选的自定义字符串。它是一个字节串(bytes),用于在计算哈希值时添加自定义的上下文信息。如果不提供 custom 参数,则默认为 None
'''
from Crypto.Hash import KangarooTwelvedata = b"Hello, world!" # 消息数据
custom = b"Hello, world!" # 消息数据kangarootwelve = KangarooTwelve.new(data,custom)# kangarootwelve.update(b"hello")print('十六进制哈希值:', kangarootwelve.read(36))
- Crypto.Hash.Poly1305:这是一种消息认证码算法,用于计算消息的认证标签。
- Poly1305.Buffer:Poly1305 哈希值的缓冲区。
- Poly1305.new(key, cipher, nonce, data):创建一个新的Poly1305 哈希对象
'''
key:用于计算认证标签的密钥。它是一个字节串(bytes),长度为 32 字节。Poly1305 算法要求密钥长度为 256 比特。
cipher:用于加密消息的加密算法。它是一个可调用的加密函数,接受两个参数:密钥和 nonce。该函数将返回一个加密器对象,用于加密数据。
nonce:用于加密消息的一次性值。它是一个字节串(bytes),长度为 16 字节。每个消息都应该使用不同的 nonce 值,以确保安全性。
data:要计算认证标签的消息数据。它是一个字节串(bytes)
'''
from Crypto.Cipher import ChaCha20
from Crypto.Hash import Poly1305
from Crypto.Random import get_random_byteskey = get_random_bytes(32) # 密钥
nonce = get_random_bytes(12) # 一次性值
data = b"Hello, world!" # 消息数据cipher = ChaCha20.new(key=key, nonce=nonce) # 创建 ChaCha20 加密器
encrypted_data = cipher.encrypt(data) # 加密消息数据POLY1305 = Poly1305.new(key=key, cipher=ChaCha20, nonce=nonce, data=encrypted_data)# POLY1305.update(b"hello")print('十六进制哈希值:', POLY1305.hexdigest())
print('十六字节哈希值:', POLY1305.digest())
print('验证十六字节哈希值:', POLY1305.verify(POLY1305.digest()))
print('验证十六进制哈希值:', POLY1305.hexverify(POLY1305.hexdigest()))
五、pycryptodome之Crypto.IO
提供了一些输入输出相关的功能。例如,可以使用其中的类来进行文件的加密和解密操作。
- Crypto.IO.PEM:处理 PEM(Privacy-Enhanced Mail)格式的数据。PEM 是一种常见的用于存储和传输加密数据的格式,如证书、私钥等。PEM 模块可以用于读取、写入和解析 PEM 格式的数据
- PEM.encode(data,marke,passphrase,randfunc):编码为 PEM 数据
data:要编码为 PEM 格式的二进制数据。可以是字节串或可迭代对象,如字符串或字节数组。
marker:可选参数,表示 PEM 数据块的标记(marker)。默认值为 None,表示没有标记。如果提供了标记,将在 PEM 数据块的起始行和结束行之间添加标记。
passphrase:可选参数,用于加密 PEM 数据块的密码短语(passphrase)。默认值为 None,表示不加密。如果提供了密码短语,将使用它对 PEM 数据块进行加密。
randfunc:可选参数,用于生成随机数据的随机数生成器函数。默认值为 None,表示使用默认的随机数生成器。如果需要加密 PEM 数据块,则需要提供一个随机数生成器函数。
- PEM.decode(pem_data, passphrase):解码 PEM 数据
'''
pem_data:要解码的 PEM 格式数据,可以是字节串或字符串。它应该包含完整的 PEM 数据块,包括起始行(如 "-----BEGIN XYZ-----")和结束行(如 "-----END XYZ-----")。
passphrase:可选参数,用于解密加密的 PEM 数据块的密码短语(passphrase)。如果 PEM 数据块未加密,则可以将此参数设置为 None 或省略。
'''
from Crypto.IO import PEMdata = b'Hello, world!' # 待编码的数据pem_data = PEM.encode(data, 'DATA') # 编码为 PEM 格式decoded_data = PEM.decode(pem_data) # 解码EM 格式print('原数据:', data)
print('编码后的数据:', pem_data)
print('解码后的数据:', decoded_data)
- Crypto.IO.PKCS8:处理 PKCS8格式的数据。PKCS8是一种标准的格式,用于存储和传输公钥和私钥。PKCS8 模块可以用于读取、写入和解析 PKCS8格式的数据。
- PKCS8.wrap(private_key,key_oid,passphrase,protection,prot_params,key_params,randfunc):将私钥包装为 PKCS8 格式的加密私钥信息
private_key: 要包装的私钥对象。可以是 Crypto.PublicKey.RSA、Crypto.PublicKey.DSA 或 Crypto.PublicKey.ECC 等类型的私钥对象。
key_oid: 表示私钥算法的对象标识符(OID)。默认值为 None,表示使用默认的 OID。
passphrase: 用于加密私钥的密码短语(passphrase)。可以是字符串或字节串。
protection: 加密算法的标识符,用于保护私钥数据。可以是字符串或字节串。常见的值包括 "PBKDF2WithHMAC-SHA256AndAES256-CBC" 和 "PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC"。
prot_params: 保护参数,用于指定加密算法的参数。可以是字典或 None。
key_params: 私钥参数,用于指定私钥的格式和编码方式。可以是字典或 None。
randfunc: 用于生成随机数据的随机数生成器函数。默认值为 None,表示使用默认的随机数生成器。
- PKCS8.unwrap(p8_private_key, passphrase):解密包含有加密私钥信息的 PKCS8 格式数据
'''
p8_private_key: 包含加密私钥信息的 PKCS#8 格式数据。可以是字节串或字符串。
passphrase: 解密私钥的密码短语(passphrase)。可以是字符串或字节串。
'''
六、pycryptodome之Crypto.Signature
提供了数字签名算法的实现。可以使用其中的类来进行数字签名和验证,支持常见的数字签名算法
- Crypto.Signature.PKCS1_v1_5:PKCS1_v1_5 是一种经典的 RSA 签名方案,使用 RSA 密钥对进行签名和验证。该方案在许多应用中广泛使用。
'''
rsa_key:RSA 密钥对象。它可以是一个 Crypto.PublicKey.RSA 对象,表示一个 RSA 密钥对。可以使用 RSA.generate() 方法来生成密钥对,或者使用 Crypto.PublicKey.RSA.import_key() 方法从已有的密钥数据中导入密钥对
'''
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import MD5key = RSA.generate(2048) # 生成 RSA 密钥对plaintext = b'Hello, world!' # 加密数据signer = PKCS1_v1_5.new(key) # 创建 PKCS1_v1_5 验证对象# 数据data = b"Hello, world!"# 使用私钥进行签名hash_value = MD5.new(data)
signature = signer.sign(hash_value)verifier = PKCS1_v1_5.new(key) # 创建 PKCS1_v1_5 验证对象print("验证密钥RSA密钥是否适用PKCS1_v1_5签名:", verifier.can_sign())
print("签名验证结果:", verifier.verify(hash_value, signature))
- Crypto.Signature.PKCS1_PSS:使用 RSA 密钥对进行签名和验证,PKCS1_PSS 是一种更现代的 RSA 签名方案,提供更好的安全性和抗攻击性能。
'''
rsa_key:RSA 密钥对象。它可以是一个 Crypto.PublicKey.RSA 对象,表示一个 RSA 密钥对。可以使用 RSA.generate() 方法来生成密钥对,或者使用 Crypto.PublicKey.RSA.import_key() 方法从已有的密钥数据中导入密钥对。
mgfunc:消息生成函数。它是一个可选参数,用于指定一个哈希算法,用于生成消息的掩码。默认值为 Crypto.Hash.MGF1。
saltLen:盐的长度。它是一个可选参数,用于指定盐的长度(以字节为单位)。默认值为 Crypto.Signature.PKCS1_PSS.MAX_LENGTH,表示使用与密钥长度相同的盐长度。
randfunc:随机数生成函数。它是一个可选参数,用于生成随机数。默认值为 Crypto.Random.get_random_bytes。
'''
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_PSS
from Crypto.Hash import MD5key = RSA.generate(2048) # 生成 RSA 密钥对
plaintext = b'Hello, world!' # 加密数据signer = PKCS1_PSS.new(key) # 创建PKCS1_PSS验证对象# 数据
data = b"Hello, world!"# 使用私钥进行签名
hash_value = MD5.new(data)
signature = signer.sign(hash_value)verifier = PKCS1_PSS.new(key) # 创建PKCS1_PSS验证对象print("验证密钥RSA密钥是否适用PKCS1_PSS签名:", verifier.can_sign())
print("签名验证结果:", verifier.verify(hash_value, signature))
- Crypto.Signature.DSS:使用 DSA 密钥对进行签名和验证,适用于需要较短签名长度和高性能的场景,DSA 是一种非对称加密算法,用于数字签名
'''
key:DSA 密钥对象,可以使用 Crypto.PublicKey.DSA 类生成密钥对,并将私钥或公钥对象传递给构造函数。
mode:字符串,指定 DSS 签名模式。可以使用 'fips-186-3' 或 'deterministic-rfc6979'。
encoding:字符串,指定消息的编码方式。可以使用 'raw' 或 'der'。
randfunc:可选参数,用于生成随机数的函数。如果不提供此参数,则使用默认的随机数生成函数。
'''
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256key = DSA.generate(2048) # 生成 DSA 密钥对
plaintext = b'Hello, world!' # 加密数据
mode = 'fips-186-3'signer = DSS.new(key, mode) # 创建 DSS 签名对象hash_value = SHA256.new(plaintext)
signature = signer.sign(hash_value)verifier = DSS.new(key, mode) # 创建 DSS 验证对象print("验证密钥 DSA 密钥是否适用 DSS 签名:", verifier.can_sign())
print("签名验证结果:", verifier.verify(hash_value, signature))
七、pycryptodome之Crypto.PublicKey
提供了非对称加密算法(公钥加密算法)的实现。可以使用其中的类来生成密钥对、进行加密和解密操作,支持常见的非对称加密算法,如RSA、DSA等。
- Crypto.PublicKey.RSA:RSA 提供了 RSA 密钥对的生成、加密和解密功能。
- RSA.RsaKey:RsaKey 是一个类,表示 RSA 密钥对。它是 RSA 密钥对的基类,包括公钥和私钥。
RSA.RsaKey.e:公钥指数。在 RSA 密钥对中,公钥由指数 e 和模数 n 组成。
RSA.RsaKey.n:模数。在 RSA 密钥对中,模数 n 是一个大整数,用于加密和解密操作。
RSA.RsaKey.d:私钥指数。在 RSA 密钥对中,私钥由指数 d 和模数 n 组成。
RSA.RsaKey.invp:p 的模反元素。在 RSA 密钥对中,p 是模数 n 的一个素因子。
RSA.RsaKey.invq:q 的模反元素。在 RSA 密钥对中,q 是模数 n 的另一个素因子。
RSA.RsaKey.q:n 的另一个素因子。
RSA.RsaKey.p:n 的一个素因子。
RSA.RsaKey.u:p 的模反元素。
RSA.RsaKey.export_key(format, passphrase, pkcs, protection, randfunc):将密钥导出为字符串。该方法与 exportKey 方法相同,只是方法名不同。
RSA.RsaKey.public_key():返回公钥对象。该方法与 publickey 方法相同,只是方法名不同。
RSA.RsaKey.can_encrypt():检查密钥是否可用于加密操作。
RSA.RsaKey.can_sign():检查密钥是否可用于签名操作。
RSA.RsaKey.has_private():检查密钥是否包含私钥。
RSA.RsaKey.size_in_bits():返回密钥的位数。
RSA.RsaKey.size_in_bytes():返回密钥的字节数。
- RSA.construct(rsa_components):用于根据给定的 RSA 组件构造 RSA 密钥对,返回RsaKey对象
rsa_components 是一个字典,包含了 RSA 密钥的组件,如 n(模数)、e(公钥指数)、d(私钥指数)等。
- RSA.generate(bits, randfunc, e=65537):用于生成指定位数的 RSA 密钥对,返回RsaKey对象
bits 是密钥的位数
randfunc 是一个随机数生成函数
e 是公钥指数,默认为 65537。
- RSA.import_key(extern_key, passphrase):用于从外部密钥(如 PEM 格式的密钥文件)中导入 RSA 密钥,返回RsaKey对象
extern_key 是一个表示外部密钥的字符串或文件对象
passphrase 是密钥的密码(如果有的话)。
- Crypto.PublicKey.DSA:提供了 DSA 密钥对的生成、签名和验证功能。
- DSA.DsaKey:表示 DSA 密钥对,包括公钥和私钥。
DSA.DsaKey.public_key():返回公钥对象。该方法返回一个新的 DSA.DsaKey 对象,表示 DSA 密钥对的公钥部分。
DSA.DsaKey.export_key(format, pkcs8, passphrase, protection, randfunc):将密钥导出为字符串。该方法可以接受多个参数,包括 format(导出格式,默认为 PEM)、pkcs8(是否使用 PKCS#8 格式,默认为 False)、passphrase(密钥的密码,可选)、protection(密钥的保护级别,默认为 None)和 randfunc(随机数生成函数,可选)。
DSA.DsaKey.has_private():检查密钥是否包含私钥。
DSA.DsaKey.can_sign():检查密钥是否可用于签名操作。
DSA.DsaKey.can_encrypt():检查密钥是否可用于加密操作。
DSA.DsaKey.domain():返回 DSA 密钥对的域参数。该方法返回一个字典,包含了 DSA 密钥对的参数,如 p(素数)、q(素数)、g(生成元)等。
- DSA.generate(bits, randfunc, domain):用于生成指定位数的 DSA 密钥对,返回DsaKey对象
bits 是密钥的位数
randfunc 是一个随机数生成函数
domain 是一个字典,包含了 DSA 密钥对的域参数,如 p(素数)、q(素数)、g(生成元)等。
- DSA.import_key(extern_key, passphrase):用于从外部密钥(如 PEM 格式的密钥文件)中导入 DSA 密钥,返回DsaKey对象
extern_key 是一个表示外部密钥的字符串或文件对象
passphrase 是密钥的密码(如果有的话)。
- DSA.construct(tup, consistency_check):construct 是一个函数,用于根据给定的元组构造 DSA 密钥对,返回DsaKey对象
tup 是一个元组,包含了 DSA 密钥的组件,如 y(公钥)、x(私钥)、p(素数)、q(素数)、g(生成元)等
consistency_check 是一个布尔值,表示是否进行一致性检查。
- Crypto.PublicKey.ElGamal:提供了 ElGamal 密钥对的生成、加密和解密功能。
- ElGamal.ElGamalKey:表示 ElGamal密钥对
ElGamal.ElGamalKey.can_sign():用于检查密钥对是否可以用于签名操作。如果密钥对包含私钥,则可以进行签名操作,该方法将返回 True;否则,返回 False。
ElGamal.ElGamalKey.can_encrypt():用于检查密钥对是否可以用于加密操作。如果密钥对包含公钥,则可以进行加密操作,该方法将返回 True;否则,返回 False。
ElGamal.ElGamalKey.has_private():用于检查密钥对是否包含私钥。如果密钥对包含私钥,则返回 True;否则,返回 False。
ElGamal.ElGamalKey.publickey():用于获取密钥对的公钥部分。它返回一个新的 ElGamal.ElGamalPublicKey 对象,其中只包含公钥信息,不包含私钥信息。
- ElGamal.generate(bits, randfunc):用于生成指定位数的 ElGamal 密钥对
bits 是密钥的位数
randfunc 是一个随机数生成函数。
- ElGamal.construct(tup):用于根据给定的元组构造 ElGamal 密钥对
tup 是一个元组,包含了 ElGamal 密钥的组件,如 p(素数)、g(生成元)、y(公钥)、x(私钥)等。
- Crypto.PublicKey.ECC:提供了 ECC 密钥对的生成、加密和解密功能。
- ECC.EccKey:表示 ECC密钥对
ECC.EccKey.d:表示 ECC 密钥对的私钥。
ECC.EccKey.curve:c表示 ECC 密钥对所使用的椭圆曲线。
ECC.EccKey.pointQ:表示 ECC 密钥对的公钥点。
ECC.EccKey.export_key(format='PEM'):用于导出 ECC 密钥对的数据。format 参数指定导出的格式,默认为 'PEM' 格式。
ECC.EccKey.public_key():用于获取 ECC 密钥对的公钥部分。它返回一个新的 ECC.EccKey 对象,其中只包含公钥信息,不包含私钥信息。
ECC.EccKey.has_private():用于检查 ECC 密钥对是否包含私钥。如果密钥对包含私钥,则返回 True;否则,返回 False。
- ECC.generate(**kwargs):generate() 函数用于生成一个新的 ECC 密钥对。可以通过关键字参数来指定生成密钥对的方式和参数,返回EccKey对象
curve:指定要使用的椭圆曲线,可以是一个 ECC.Curve 对象或椭圆曲线的名称。
entropy:指定用于生成密钥对的熵(随机性),可以是一个字节串或一个可调用对象。
randfunc:指定用于生成随机数的函数。默认情况下,使用系统提供的随机数生成函数。
- ECC.construct(**kwargs):construct() 函数用于根据给定的参数构造一个 ECC 密钥对,返回EccKey对象
curve:指定要使用的椭圆曲线,可以是一个 ECC.Curve 对象或椭圆曲线的名称。
point:指定曲线上的一个点,可以是一个 ECC.Point 对象或表示点坐标的元组。
- ECC.import_key(encoded, passphrase=None, curve_name=None):import_key() 函数用于从给定的数据导入一个 ECC 密钥对,返回EccKey对象
encoded:表示要导入的密钥对的数据,可以是一个字节串或字符串。
passphrase(可选):如果密钥对被密码保护,需要提供正确的密码短语才能成功导入密钥对。
curve_name(可选):指定要使用的椭圆曲线的名称。
八、pycryptodome之Crypto.Random
提供了生成随机数的功能。可以使用其中的函数来生成伪随机数和强随机数。
- Crypto.Random.random:随机数
- random.choice(seq):从给定的序列中随机选择一个元素并返回。
'''
sep:这可迭代的序列,例如列表、元组或字符串,然后从中随机选择一个元素并返回
'''
- random.sample(population, k):从给定的总体中随机选择指定数量的唯一元素,并以列表形式返回。
'''
population:可迭代的总体作为参数,例如列表、元组或字符串,然后从中随机选择指定数量的唯一元素,并以列表形式返回。
k:指定返回数量
'''
- random.randint(a, b):生成一个指定范围内的随机整数,范围包括a和b
- random.getrandbits(k):生成一个k位的随机整数,并返回
- random.randrange(start, stop[, step]):从指定范围内按指定步长随机选择一个整数并返回
'''
start表示起始值(包含)
stop表示终止值(不包含)
step表示步长,默认为1
'''
- andom.shuffle(x):随机打乱可变序列(例如列表),直接修改原始序列直接修改原始序列
- Crypto.Random.get_random_bytes(n):生成一个包含n个随机字节的字节串
- Crypto.Random.getrandbits(k):生成一个k位的随机整数==
- Crypto.Random.atfork():在多线程环境中使用,用于重置随机数生成器的状态。这个函数会在fork子进程之前调用,以避免子进程继承父进程的随机数状态。
九、pycryptodome之Crypto.Util
提供了一些常用的工具函数。例如,可以使用其中的函数来进行字节串的编码、解码,进行填充操作等。
- Crypto.Util.Padding:提供了填充和去填充数据的函数。
- pad(data_to_pad, block_sizet style):用于填充数据
'''
data_to_pad:要进行填充的数据,类型为字节串(bytes)。
block_size:数据块的长度,以字节为单位。填充后的数据长度将是 block_size 的整数倍。
style:填充的风格,可选值为 'pkcs7'、'iso7816'、'x923'、'iso10126'、'zero' 或 None。默认值为 'pkcs7'。None:不进行填充,如果数据长度不是块长度的整数倍,则会引发 ValueError 异常。
'''
- unpad(added_data, block_size style):用于去除填充
padded_data:已填充的数据,类型为字节串(bytes)。
block_size:数据块的长度,以字节为单位。
style:填充的风格,与 pad() 函数中的风格参数相同。默认值为 'pkcs7'。
- Crypto.Util.number:提供了处理大整数的函数,例如生成随机素数、计算模反元素等。
- number.inverse(x, m):计算模 m 下 x 的乘法逆元。返回值为 x 在模 m 下的乘法逆元。
- number.size(x):返回整数 x 的字节大小。
- number.GCD(a, b):计算整数 a 和 b 的最大公约数(Greatest Common Divisor,GCD)。返回值为 a 和 b 的最大公约数。
- number.bytes_to_long(s):将字节串 s 转换为对应的长整数。
- number.long_to_bytes(n, blocksize):将长整数 n 转换为字节串,其中 blocksize 指定了输出的字节块大小。
- number.ceil_div(a, b):计算整数 a 除以整数 b 的向上取整除法结果。
- number.getPrime(N, randfunc=None):生成一个 N 位的素数。可选参数 randfunc 是一个随机数生成函数,用于生成随机数。
- number.getRandomInteger(N, randfunc=None):生成一个 N 位的随机整数。可选参数 randfunc 是一个随机数生成函数,用于生成随机数。
- number.getRandomNBitInteger(N, randfunc=None):生成一个 N 位的随机整数。可选参数 randfunc 是一个随机数生成函数,用于生成随机数。
- number.getRandomRange(start, stop, randfunc=None):生成一个在范围 [start, stop) 内的随机整数。可选参数 randfunc 是一个随机数生成函数,用于生成随机数。
- number.getStrongPrime(N, e, randfunc=None):生成一个 N 位的强素数,其中 e 是公共指数。可选参数 randfunc 是一个随机数生成函数,用于生成随机数。
- number.isPrime(n, k=10):检查整数 n 是否为素数。可选参数 k 指定了进行 Miller-Rabin 素性测试的次数。
- number.long2str(n):将长整数 n 转换为字节串。
- number.str2long(s):将字节串 s 转换为长整数。
- Crypto.Util.py3compat:提供了与 Python 2 和 Python 3 兼容性相关的函数和类。
- py3compat.bord(x):将字节或字符 x 转换为对应的整数值。在 Python 2 中,x 可以是一个字符或字节;在 Python 3 中,x 必须是一个整数。
- py3compat.bchr(x):将整数 x 转换为对应的字节或字符。在 Python 2 中,返回一个字符;在 Python 3 中,返回一个字节。
- py3compat.tobytes(x):将输入 x 转换为字节串。在 Python 2 中,x 可以是一个字符串或字节串;在 Python 3 中,x 必须是一个字符串。
- py3compat.b(x):将输入 x 转换为字节串。在 Python 2 中,返回输入 x 本身;在 Python 3 中,如果 x 是字符串,则返回其对应的字节串。
- py3compat.BytesIO():创建一个类似于文件对象的字节串缓冲区。在 Python 2 和 Python 3 中都可用。
- py3compat.bytestring(x):将输入 x 转换为字节串。在 Python 2 中,x 可以是一个字符串或字节串;在 Python 3 中,x 必须是一个字符串。
- py3compat.is_bytes(x):检查输入 x 是否为字节串。在 Python 2 和 Python 3 中都可用。
- py3compat.is_native_int(x):检查输入 x 是否为本机整数类型。在 Python 2 和 Python 3 中都可用。
- py3compat.is_string(x):检查输入 x 是否为字符串类型。在 Python 2 和 Python 3 中都可用。
- py3compat.StringIO():创建一个类似于文件对象的字符串缓冲区。在 Python 2 和 Python 3 中都可用。
- py3compat.tostr(x):将输入 x 转换为字符串。在 Python 2 中,x 可以是一个字符串或字节串;在 Python 3 中,x 必须是一个字符串。
十、pycryptodome之Crypto.Protocol
提供了一些密码学协议的实现。例如,可以使用其中的类来进行密钥交换、安全通信等。
- Crypto.Protocol.SecretSharing:秘密共享,通过将秘密分割成多个部分(份额),可以将其分发给不同的参与者。只有在达到指定的阈值份额时,才能恢复原始的秘密。这对于实现安全的多方协议和数据保护非常有用。
- SecretSharing.Shamir.split(k,n,secret,ssss):分割秘密
k:一个整数,表示恢复秘密所需的最小份额数。
n:一个整数,表示生成的总份额数。
secret:一个字节串,表示要分割的原始秘密,16字节。
ssss:一个整数,表示生成份额时使用的随机数种子
- SecretSharing.Shamir.combine(shares,ssss):恢复秘密
'''
shares:一个包含份额的列表。
ssss:一个整数,表示生成份额时使用的随机数种子。
'''
from Crypto.Protocol.SecretSharing import Shamirk = 3 # 恢复秘密所需的最小份额数
n = 5 # 生成的总份额数
secret = b"Hello,Word!!!!!!" # 要分割的原始秘密shares = Shamir.split(k, n, secret) #分割秘密
print("生成的份额:", shares)recovered_secret = Shamir.combine(shares[:k]) # 组合份额恢复秘密
print("恢复的秘密:", recovered_secret)
- Crypto.Protocol.KDF:密钥派生,密钥派生函数可以从一个输入密钥派生出更长或更复杂的密钥,以供加密、认证或其他密码学操作使用。
- KDF.HKDF(master, key_len, salts, hashmod, num_keys, context):基于 HMAC 的密钥派生函数(HKDF)的实现。它使用输入的主密钥(master)和其他可选参数来派生一个或多个密钥,返回一个包含派生密钥的列表。
master:一个字节串,作为主密钥。
key_len:一个整数,表示派生密钥的长度。
salts:一个字节串或一个列表,用于指定盐值。如果提供了多个盐值,则会使用每个盐值进行密钥派生,并将结果连接在一起。
hashmod:一个哈希模块,例如 Crypto.Hash.SHA256。
num_keys:一个整数,表示要派生的密钥个数。
context:一个字节串,用于提供上下文信息。
- KDF.scrypt(password, salt, key_len, N, r, p, num_keys):基于密码派生函数的实现。它使用密码和盐值作为输入,并使用一组参数来派生一个或多个密钥,返回一个包含派生密钥的列表。
password:一个字节串,作为密码。
salt:一个字节串,作为盐值。
key_len:一个整数,表示派生密钥的长度。
N:一个整数,表示 scrypt 的 CPU/内存成本因子。
r:一个整数,表示 scrypt 的块大小。
p:一个整数,表示 scrypt 的并行化因子。
num_keys:一个整数,表示要派生的密钥个数。
- KDF.bcrypt(password, cost, salt):bcrypt 密码哈希函数的实现。它使用密码和盐值作为输入,并使用指定的计算成本(cost)来计算哈希值,返回一个包含 bcrypt 哈希值的字节串
password:一个字节串,作为密码。
cost:一个整数,表示计算成本,即计算哈希值所需的时间和资源。
salt:一个字节串,作为盐值。
- KDF.bcrypt_check(password, bcrypt_hash):验证 bcrypt 哈希值的函数。它使用密码和存储的 bcrypt 哈希值作为输入,并返回一个布尔值,指示密码是否匹配存储的哈希值,返回一个布尔值,指示密码是否匹配存储的哈希值。
password:一个字节串,作为密码。
bcrypt_hash:一个字节串,作为存储的 bcrypt 哈希值。
- KDF.PBKDF1(password, salt, dkLen, count, hashAlgo):PBKDF1 密码基于密码派生函数的实现。它使用密码和盐值作为输入,并使用指定的哈希算法和迭代次数来派生密钥,返回一个包含派生密钥的字节串。
password:一个字节串,作为密码。
salt:一个字节串,作为盐值。
dkLen:一个整数,表示派生密钥的长度。
count:一个整数,表示迭代次数。
hashAlgo:一个哈希算法模块,例如 Crypto.Hash.SHA256。
- KDF.PBKDF2(password, salt, dkLen, count, prf, hmac_hash_module):BKDF2 密码基于密码派生函数的实现。它使用密码和盐值作为输入,并使用指定的伪随机函数(PRF)和迭代次数来派生密钥,返回一个包含派生密钥的字节串。
password:一个字节串,作为密码。
salt:一个字节串,作为盐值。
dkLen:一个整数,表示派生密钥的长度。
count:一个整数,表示迭代次数。
prf:一个 PRF 对象,例如 Crypto.Protocol.KDF.PRF。
hmac_hash_module:一个哈希算法模块,例如 Crypto.Hash.SHA256。
- KDF.SP800_108_Counter(master, key_len, prf, num_keys, label, context):使用 SP800-108 密钥派生函数派生密钥
master:主密钥。
master:主密钥。
key_len:派生密钥的长度(以字节为单位)。
prf:伪随机函数。
num_keys:要派生的密钥数量。
label:标签。
context:上下文数据(可选参数)。
十一、pycryptodome之Crypto.Math
提供了一些密码学相关的数学函数和算法的实现。例如,可以使用其中的类来进行大数运算、素数生成和验证等。
- Crypto.Math.Primality:素数相关数学函数
- generate_probable_prime(exact_bits, randfunc, prime_filter):用于生成一个指定位数的可能素数
exact_bits:生成素数的位数。
randfunc:一个随机数生成函数,用于生成随机数。
prime_filter:一个可选的函数,用于过滤掉不符合特定条件的候选素数。
- generate_probable_safe_prime(exact_bits, randfunc):用于生成一个指定位数的可能安全素数
exact_bits:生成素数的位数。
randfunc:一个随机数生成函数,用于生成随机数。
- Crypto.Math.Numbers:数字相关数学函数
- numbers = Numbers.Integer(2):创建Numbers对象
- numbers.ize_in_bytes():返回整数的字节大小。
- numbers.size_in_bits():返回整数的位数。
- numbers.set(source):将整数设置为给定的值。
- numbers.random(**kwargs):生成一个随机的整数。
- numbers.random_range(**kwargs):生成一个指定范围内的随机整数。
- numbers.sqrt(modulus):计算整数的平方根模 modulus。
- numbers.lcm(term):计算整数与给定项 term 的最小公倍数。
- numbers.gcd(term):计算整数与给定项 term 的最大公约数。
- numbers.fail_if_divisible_by(small_prime):如果整数可以被给定的小质数 small_prime 整除,则引发异常。
- numbers.from_bytes(byte_string, byteorder):将字节字符串转换为整数。
- numbers.get_bit():返回整数的最低有效位。
- numbers.inplace_inverse(modulus):计算整数在模 modulus 下的乘法逆元并修改原始整数。
- numbers.inverse(modulus):计算整数在模 modulus 下的乘法逆元。
- numbers.is_odd():检查整数是否为奇数。
- numbers.is_even():检查整数是否为偶数。
- numbers.inplace_pow(exponent, modulus):计算整数的幂次方并修改原始整数。
- numbers.is_negative():检查整数是否为负数。
- numbers.is_perfect_square():检查整数是否为完全平方数。
相关文章:
python之pycryptodome模块,加密算法库
一、简介 PyCryptodome是PyCrypto库的一个分支,它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现,包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能,如密码学安全随机…...

IDEA如何将本地项目推送到GitHub上?
大家好,我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境(IDE),它支持多种编程语言和工具。它也内置了对Git和GitHub的支持,让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册,描述了…...

Leetcode—45.跳跃游戏II【中等】
2023每日刷题(四十) Leetcode—45.跳跃游戏II 贪心法思想 实现代码 #define MAX(a, b) (a > b ? (a) : (b))int jump(int* nums, int numsSize) {int start 0;int end 1;int ans 0;int maxStride 0;while(end < numsSize) {maxStride 0;fo…...

基于Vue+SpringBoot的木马文件检测系统
项目编号: S 041 ,文末获取源码。 \color{red}{项目编号:S041,文末获取源码。} 项目编号:S041,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…...
springboot内置Tomcat流程
1、org.springframework.boot.SpringApplication#initialize setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));加载了org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext 2、spring refres…...

Android修行手册-溢出父布局的按钮实现点击
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...

Transformer——decoder
上一篇文章,我们介绍了encoder,这篇文章我们将要介绍decoder Transformer-encoder decoder结构: 如果看过上一篇文章的同学,肯定对decoder的结构不陌生,从上面框中可以明显的看出: 每个Decoder Block有两个…...

基于 STM32 的温度测量与控制系统设计
本文介绍了如何基于 STM32 微控制器设计一款温度测量与控制系统。首先,我们将简要介绍 STM32 微控制器的特点和能力。接下来,我们将详细讨论温度传感器的选择与接口。然后,我们将介绍如何使用 STM32 提供的开发工具和相关库来进行温度测量和控…...

python之pyqt专栏3-QT Designer
从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析,我们对QT Designer有基础的认识。 QT Designer用来创建UI界面,保存的文件是"xxx.ui"文件,"xxx.ui"可以被pyuic转换为"xxx.py",而&…...

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)
文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程,对云开发的入门做了介绍,以及使用一个省市地区联动的地址选择器…...

HCIA题目解析(1)
1、【多选题】关于动态 MAC 地址表说法正确的是? A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数,可以获取接口下通信的用户数 C、在设备重启后,之前的动态表项会丢失 D、在设备重启后&…...
运维高级-day02
一、编写系统服务启动脚本 RHEL6风格 1、Linux运行级别 Linux运行有七个级别 级别 描述 0 停机状态,系统默认运行级别不能设置为0,否则系统不能正常启动。使用init0命令,可关闭系统 1 单用户状态,此状态仅root用户可登录。用…...
虹科分享 | 平衡速度和优先级:为多样化的实时需求打造嵌入式网络(2)——实时通信系统的需求
现代实时应用的复杂性和需求不断增加,需要强大而可靠的通信系统。正如本系列第一部分所述,这些应用涵盖从秒到毫秒的广泛响应时间要求,它们的成功通常取决于其响应的精确时间。因此,所选的通信系统必须能够满足这些严格的时序限制…...

佳易王各行业收银管理系统软件,企业ERP管理软件,企业或个体定制开发软件以及软件教程资源下载总目录,持续更新,可关注收藏查阅
系统简介 1、佳易王软件功能实用、操作简单、软件绿色免安装,解压即可使用,软件已经内置数据库,不需再安装其他数据库文件。 2、佳易王软件,已经形成系列,上百款管理系统软件涵盖多个行业。 3、已为多个企业个体定制…...
C_4练习题
一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 定义如下变量和数组: int i; int x[3][3]{1,2,3,4,5,6,7,8,9}; 则下面语句的输…...

自动化测试-Selenium
一. Selenium介绍 selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言 原理: 二. 元素定位 2.1 XPath 定位 绝对路径: /html/head/title 相对路径以双斜杠开头,常见的相对路径定位有以下几种: <1>相对路径索引: 索引是从1开始的 <2>相…...
基于单片机的温湿度检测系统设计
目录 摘 要... 2 第一章 绪论... 5 1.1 研究课题背景... 5 1.2 国内外发展概况... 7 1.3 课题研究的目的... 8 1.4 课题的研究内容及章节安排... 8 第二章 温湿度检测系统控制系统的设计方案... 10 2.1 设计任务及要求... 10 2.2 温湿度检测系统总体设计方…...
C# 关于异常处理 try-catch语句的使用
在实际应用中,比如涉及文件读写、网络通信时,会因为文件不存在、权限不够、网络异常等原因引发异常,或者对数据库连接、查询、更新等操作,会因为连接超时、语法错误、唯一约束冲突等引发异常。 看过去的代码,当进行上…...
【LeeCode】26.删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需…...
4-Docker命令之docker create
1.docker create介绍 docker create命令是用于创建一个新的容器,等价于docker run -d命令,但是与docker run -d不同的是,docker create创建的容器并未实际启动,需要指定docker start命令启动。 2.docker create用法 docker create [参数] [root@centos79 ~]# docker cr…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...