Python中的加密和解密。Pycrypto指南

1,517 阅读5分钟

Pycrypto Example | Encryption And Decryption in Python

Pycrypto是一个提供加密服务的Python模块。Pycrypto的完整形式是Python Cryptography Toolkit。 Pycrypto模块是一个安全哈希函数的集合,如RIPEMD160 、SHA256, 以及 各种加密算法,如 AESDESRSAElGamal等。例如,AES是非常快速和可靠的,是对称加密的事实标准。

AES加密

**高级加密标准(AES)**是对称的块状密码。

AES包括三种块密码。

  1. AES-128
  2. AES-192
  3. AES-256

AES-128使用128位密钥长度来加密和解密一个信息块,AES-192使用192位密钥长度,AES-256使用256位密钥长度来加密和解密信息。

每个密码都使用128位、192位和256位的密码密钥,以128位的块为单位对数据进行加密和解密。

对称,又称秘钥,密码使用相同的密钥进行加密和解密,因此发送方和接收方必须都知道--并使用--相同的秘钥。

所有的密钥长度都可以用来保护机密和秘密级别的信息。绝密信息需要192位或256位密钥长度。

在这个例子中,我们将看到16字节文本的AES加密和解密。

在Python中创建加密和解密的步骤

要在Python中使用AES加密和解密,我们必须遵循以下步骤。

  1. 生成一个密匙。
  2. 生成一个初始化向量。
  3. 创建一个AES密码。
  4. 用AES对信息进行加密
  5. 解密信息

生成一个密匙

AES 加密 需要一个强大的密钥。密钥越强,你的加密就越强。这可能是整个链条中最薄弱的环节。为了生成一个密匙,我们将使用**Python os模块的urandom()**方法。

**Python os.urandom()**函数用于生成适合加密使用的随机字节大小的字符串,或者我们可以说这个方法生成了包含随机字符的字符串。

from os import urandom

secret_key = urandom(16)
print(secret_key)

输出

b'I\xff\xd5\xbb3\xae\xd7\xd8\x9c\xf1\xc3}\x8d\xd0*\x1a'

所以,我们的秘钥已经生成了。你必须为AES加密生成一个强大的密钥。

让我们进入下一个步骤。

生成一个初始化向量

初始化向量的主要目的是产生不同的加密数据,这样攻击者就不能使用密码分析来推断出密钥数据或消息数据。

我们将使用os.urandom()函数生成初始化向量。

from os import urandom

iv = urandom(16)
print(iv)

输出

b"NU\x95c'pfc\xe9\xc0X\x81\xd8\x13\x18("

所以,我们的iv已经生成了。

初始化向量必须传输给接收者以进行适当的解密,但它不需要被保密。相反,它被打包到输出文件的开头(在原始文件大小的8个字节之后),所以接收者可以在解密实际数据之前读取它。

创建一个AES密码

我们现在创建AES密码,用它来加密一个字符串(或一组字节;数据不一定是纯文本)。

AES密码是用CBC模式创建的,其中每个区块都是 "链式 "的,与流中的前一个区块相连。(除非感兴趣,否则你不必知道确切的细节。你所需要知道的是--使用CBC模式)。

另外,对于使用pycrypto的AES加密,你必须确保数据的长度是16字节的倍数。如果不是的话,就给缓冲区加垫子,并在输出的开始部分包括数据的大小,以便接收方能够充分地解密。

请看下面的代码。

from os import urandom
from Crypto.Cipher import AES

# For Generating AES Cipher text
secret_key = urandom(16)
iv = urandom(16)
obj = AES.new(secret_key, AES.MODE_CBC, iv)

在上面的代码中,我们生成了两个导入模块。

  1. urandom
  2. AES

为了生成AES密码对象,我们必须使用AES.new()方法。

现在,AES.new()方法需要三个参数。

  1. secret_key
  2. AES.MODE.CBC
  3. iv

AES.MODE.CBC是对称块密码的经典操作模式之一。

对称区块密码的经典操作模式

AES支持的操作模式的模块常量。

MODE_ECB。电子密码本(ECB)
MODE_CBC:Cipher-Block Chaining (CBC)
MODE_CFB: Cipher Feedback (CFB)
MODE_OFB:输出反馈(OFB)
MODE_CTR:计数器模式(CTR)
MODE_OPENPGP :OpenPGP模式
MODE_CCM:带CBC-MAC的计数器(CCM)模式
MODE_EAX:EAX模式
MODE_GCM:Galois计数器模式(GCM)
MODE_SIV:合成初始化矢量(SIV)
MODE_OCB:偏移代码书(OCB)

用AES对信息进行加密

这是AES加密的最后一步。

我们将首先定义需要加密的信息,然后使用AES.encrypt()函数。

from os import urandom
from Crypto.Cipher import AES

# For Generating cipher text
secret_key = urandom(16)
iv = urandom(16)
obj = AES.new(secret_key, AES.MODE_CBC, iv)

# Encrypt the message
message = 'Lorem Ipsum text'
print('Original message is: ', message)
encrypted_text = obj.encrypt(message)
print('The encrypted text', encrypted_text)

输出

Original message is:  Lorem Ipsum text
The encrypted text b'a\xc4+(\xb2\x15\x92\x93\x17\x8c\x01\x8a\xba\xe6\xff5'

这就是了。我们已经用Python中的AES加密了信息。

在Python中解密信息

解密需要数据被加密的密钥。然后,你需要使用一个安全通道将密钥发送给接收者。

我们将使用AES的decrypt()方法来解密加密的信息,并取回我们的原始文本。

from os import urandom
from Crypto.Cipher import AES

# For Generating cipher text
secret_key = urandom(16)
iv = urandom(16)
obj = AES.new(secret_key, AES.MODE_CBC, iv)

# Encrypt the message
message = 'Lorem Ipsum text'
print('Original message is: ', message)
encrypted_text = obj.encrypt(message)
print('The encrypted text', encrypted_text)

# Decrypt the message
rev_obj = AES.new(secret_key, AES.MODE_CBC, iv)
decrypted_text = rev_obj.decrypt(encrypted_text)
print('The decrypted text', decrypted_text.decode('utf-8'))

输出

Original message is:  Lorem Ipsum text
The encrypted text b'\xc8\x01\x14y\xeb\xb9\xa4#\xd5bQ\xeb\xe0\x00"\t'
The decrypted text Lorem Ipsum text

这就是了。我们得到了原始文本。

所以,这就是你在Python中加密和解密字符串的方法。

参见

Python hash()

Python uuid

在Python中生成一个随机数

The postEncryption And Decryption in Python:Pycrypto指南》首次出现在AppDividend上。