【问题标题】:AES encryption with CBC mode in python (128-Bit keys)python中使用CBC模式的AES加密(128位密钥)
【发布时间】:2020-11-07 15:39:02
【问题描述】:

我使用下面的代码在 AES 中加密了一个文本,并使用在线解密网站(Website 1Website 2)解密了密文。 但是,所有网站的解密文本前面都包含一些不需要的字符串,如this图片所示。

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

key = b'asdfghjklqwertyu'

class AESCipher(object):

    def __init__(self, key): 
        self.bs = AES.block_size
        self.key = key

    def encrypt(self, raw):
        raw = self._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()))

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

a = AESCipher(key)
print(a.encrypt('Hey There!'))

【问题讨论】:

    标签: python-3.x encryption cryptography aes pycrypto


    【解决方案1】:

    devlan 网站解释

    强烈建议使用 CBC 模式,它需要 IV 才能使每条消息都独一无二。 如果未输入 IV,则此处将使用默认值用于 CBC 模式,并且默认为从零开始的字节[16]

    因此,您添加的 IV 被视为密文块。现在,你有两个街区。在CBC模式下,解密执行为(块从1开始计数);

    Pi = Dec(key, Ci) + Ci
    C0 = IV
    
    • 你的P1 = Dec(key, C1) + C0 这是垃圾,因为IV = 0
    • 您的P2 = Dec(key, C2) + C1,这是您的原始信息。

    这是由于CBC模式的特性,下图显示了这种情况;

    很高兴您在那里和那里进行了测试。您应该在使用前阅读程序的所有文档,这在密码应用程序中更为重要。

    您添加 IV 是正确的,并且没有任何问题,您只需将您的 IV 提供给站点并且只提供密文块。

    如果您需要在没有 IV 的情况下解密文本,请在加密时将 iv 设置为默认值。

    class AESCipher(object):
    
        def __init__(self, key): 
            self.bs = AES.block_size
            self.key = key
    
        def encrypt(self, raw):
            raw = self._pad(raw)
            iv = b'\0'*16 #Default zero based bytes[16]
            cipher = AES.new(self.key, AES.MODE_CBC, iv)
            return base64.b64encode(cipher.encrypt(raw.encode()))
    
        def _pad(self, s):
            return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
    
    

    【讨论】:

    • 谢谢!在使用从零开始的字节 [16] 将 IV 设置为默认值后,它无需在我需要的站点上传递 IV 即可工作。我已经提交了使用默认 IV 添加代码的编辑。
    • 请注意,这实际上不是正确的方法。您应该将您的 IV 和密文分开,以便在站点上进行测试。在正常的 CBC 中,零 IV 与 CBC-MAC 一起使用,否则 CBC IV 必须是不可预测的,请参阅this answer下的注释
    • 谢谢。就我而言,我不希望 IV 不可预测。
    猜你喜欢
    • 2019-08-17
    • 2020-04-15
    • 2021-06-25
    • 2013-08-11
    • 1970-01-01
    • 2018-04-04
    • 2017-03-27
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多