所以我一直在制作一个加密和解密程序,我想在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)
在此先感谢您的帮助!
答案 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。
此外,您的代码包含两个安全错误:
iv = encoded[:15]
替换为encrypt
,交付结果标签(作为随机数和密文,以及第三项),并将encrypt_and_digest
替换为decrypt
)。最后一点,与CBC不同,使用OCB不需要任何填充。