使用 AES-256 和 PKCS7 填充进行加密

Dem*_*nos 4 python encryption padding pycrypto

我想使用 python 来加密一些数据,并发现 pycrypto 作为一个可能的工具。为了加密数据,我需要:

  1. 输入密码字符串
  2. SHA-256 字符串,给出 AES-256 的密钥
  3. 将敏感数据表示为 9 位字符 (ascii) 的字符串,如果存在,则带有前导 ascii 0(数据将始终采用此格式)。
  4. 在 ecb 模式下,使用 AES-256、NO SALT、使用 RFC2315 中的 PKCS7 填充来加密数据字符串。
  5. 将密文表示为 Base64 (RFC 4648),需要 24 个字符

使用 pycrypto,步骤 1-3 相当简单。4给我带来了一点麻烦。我不确定 PKCS7 填充是什么,也不知道如何确保加密不使用 SALT。我希望有人能为我指出正确的方向:第 4 步。

小智 8

PyCrypto 没有内置的填充功能。但实施起来非常容易。注意:当输入已经是正确的大小时,PKCS7 Padding 将添加一个额外的字节块,该函数也这样做。 PKCS#7此处解释了填充。

def pad(m):
    return m+chr(16-len(m)%16)*(16-len(m)%16)

KEY = sha256(passphrase).digest()  #returns 256 bit key
cipher = AES.new(KEY,AES.MODE_ECB) #creates a AES-256 instance using ECB mode
ciphertext = cipher.encrypt(pad(data)).encode('base64')
Run Code Online (Sandbox Code Playgroud)

希望这就是您正在寻找的。在解密的过程中,这个unpad功能可能会派上用场。

def pad(m):
    return m+chr(16-len(m)%16)*(16-len(m)%16)

KEY = sha256(passphrase).digest()  #returns 256 bit key
cipher = AES.new(KEY,AES.MODE_ECB) #creates a AES-256 instance using ECB mode
ciphertext = cipher.encrypt(pad(data)).encode('base64')
Run Code Online (Sandbox Code Playgroud)

在Python 3中,unpad函数可能需要强制转换(取决于用法),如下所示:

def unpad(ct):
    return ct[:-ct[-1]]
Run Code Online (Sandbox Code Playgroud)

附言,

ECB 加密模式不是加密安全的。请使用更高的模式,例如 CBC、OFB 或 GCM。

GCM 或 Galois/Counter 模式提供数据机密性和身份验证(甚至对于不需要加密的关联数据)。

这是迄今为止最安全的模式,除非您两次使用相同的随机数