Pycryptodome AES_OCB加密随机数如何添加随机数?

时间:2019-01-23 20:20:38

标签: python

所以我一直在制作一个加密和解密程序,我想在OCB模式下使用AES,唯一的问题是我不知道您如何“立即”工作并且我的程序不想接受随机数或类似的数字它只是告诉我:

“随机数最多不能超过15个字节”

我的完整代码:

import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES

BS = 16
pad = lambda s: s + (BS - len(s) %BS) * chr(BS - len(s) %BS)
unpad = lambda s : s[0:-s[-1]]

class AESCipher:

    def __init__(self, key):
        self.key = hashlib.sha256(key.encode('utf-8')).digest()

    def encrypt(self, raw):
        raw = pad(raw)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode( iv + cipher.encrypt(raw.encode('utf8')))

    def decrypt(self, encoded):
        encoded = base64.b64decode(encoded)
        iv = encoded[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return unpad(cipher.decrypt(encoded[16:]))


cipher = AESCipher('mysecretpassword')
encrypted = cipher.encrypt('Secret Message A')
decrypted = cipher.decrypt(encrypted)
print(encrypted)
print(decrypted)

因此,目前我使用的是AES CBC模式,但是由于切换到OCB应该仅将nonce作为额外参数添加,所以我只需要它。

所以我的问题基本上是:如何在代码中添加随机数以使其正常工作?

尤其是在代码行中,如果您更改模式并添加随机数:

cipher = AES.new(self.key, AES.MODE_OCB, iv, nonce=None)

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

听起来您正在尝试传递16字节的随机数。 但是,OCB模式(比CBC更好,不错的选择!)最多只能使用15个字节的随机数,因此您需要在加密端:

print(col_list)
#col_list_fnl = [e for e in col_list if e not in ('CALLS','PUTS','Chart','\xc2\xa0','\xa0')]
col_list_fnl = [e for e in col_list if e not in ('CALLS','PUTS','Chart','\xa0')]  #Experimentiing as the above not working
print(col_list_fnl)

在接收方:

iv = Random.get_random_bytes(15)

另请参见示例here

此外,您的代码包含两个安全错误:

  • 您使用SHA256派生了AES密钥。相反,您应该通过诸如PBKDF2之类的扩展函数以适当的迭代次数运行密码,并使用其输出作为密钥。
  • 您不会发送或验证身份验证标签,因此与CBC相比,OCB的主要功能(即AEAD mode)没有得到利用。您应将iv = encoded[:15] 替换为encrypt,交付结果标签(作为随机数和密文,以及第三项),并将encrypt_and_digest替换为decrypt)。

最后一点,与CBC不同,使用OCB不需要任何填充。