من در حال انجام یک برنامه فوق العاده کوچک و ساده هستم ، جایی که می خواهد کمی بیشتر این ماژول را بفهمد ، اما اتفاق بسیار عجیبی رخ می دهد.

کد زیر برمی گردد:

 Traceback (آخرین تماس آخر)
پرونده ".  crypto.py" ، خط 100 ، در  init = Emisor ()
پرونده ".  crypto.py" ، خط 15 ، در __init__ self.encrypt ()
پرونده ".  crypto.py" ، خط 71 ، در رمزگذاری گیرنده (cipher_text ، tag_mac ، self.key)
پرونده ".  crypto.py" ، خط 84 ، در __init__ self.decrypt (self.cipher_text ، self.tag_mac ، self.key)
پرونده ".  crypto.py" ، خط 93 ، در رمزگشایی plain_text = cipher.decrypt_and_verify (cipher_text، tag_mac)
پرونده "C:  Users  EQUIPO  AppData  Local  Programs  Python  Python37-32  lib  site-packets  Crypto  Cipher  _mode_gcm.py" ، خط 569 ، در رمزگشایی_اند_verify self.verify (دریافت_mac_tag)
پرونده "C:  Users  EQUIPO  AppData  Local  Programs  Python  Python37-32  lib  site-packets  Crypto  Cipher  _mode_gcm.py" ، خط 510 ، برای تأیید بالا بردن ValueError ("بررسی MAC انجام نشد")
ValueError: بررسی MAC انجام نشد

من پی دی اف های مختلف ، اسناد ، فیلم ها ، وبلاگ ها و غیره را خوانده ام ، اما راه حل را پیدا نکردم.

PDTA: این "nonce" است و آن عبارت از "سربرگ" است ، روشی به نام به روزرسانی () وجود دارد و در همین جا است که باید هدر را قرار دهم ، کمی گم شده ام که و غیره.

 از Crypto.Cipher واردات AES
از Crypto.Random واردات get_random_bytes را دریافت کنید

فرستنده کلاس ():

    Def __init __ (خود):

        self.random_password = هیچکدام
        self.message_plain = درست است
        self.key = هیچکدام

        self.password_option ()
        self.text_option ()
        self.encrypt ()



    def password_option (خود):

        در حالی که (self.random_password == هیچکدام):

            تصادفی = ورودی (" n آیا می خواهید یک کلید متقارن تصادفی تولید کنید؟ (y / n)  n  n >>>") .strip () پایین تر ()

            اگر تصادفی == "y":
                self.random_password = درست است
                خود تصادفی ()

            elif تصادفی == "n":
                self.random_password = نادرست
                خود تصادفی ()

            دیگری:
                عبور

    def text_option (خود):

        اگر self.message_plain:

            سوال = ورودی (" n چگونه پیام خود را وارد می کنید؟  n  n [1] پرونده  n  n [2] مستقیماً در برنامه  n  n >>>") .strip ()

            اگر سوال == "1":
                path = input (r " n مسیر پرونده را وارد کنید  n  n >>>") .strip ()
                name = path.split ("\") [-1]
                self.message_plain = باز (نام ، حالت = "rb")

            سوال elif == "2":
                self.message_plain = input (" n پیام خود را وارد کنید  n  n >>>") .strip ()
                self.message_plain = self.message_plain.encode ("utf-8")


    دف تصادفی (خود):

        اگر self.random_password:
            self.key = get_random_bytes (16)

        دیگری:
            self.key = input (" n گذرواژه خود را وارد کنید  n  n >>>") .strip ()


    رمزگذاری دف (خود):

        رمزگذاری = AES.new (self.key، AES.MODE_GCM)

        cipher.update (ب "هدر")

        cipher_text، tag_mac = cipher.encrypt_and_digest (self.message_plain)

        گیرنده (cipher_text ، tag_mac ، self.key)



گیرنده کلاس ():

    Def __init __ (خود ، رمزنگاری ، متن ، tag_mac ، کلید):

        self.cipher_text = رمزنگاری
        self.tag_mac = tag_mac
        key.key = کلید

        self.decrypt (self.cipher_text ، self.tag_mac ، self.key)

    رمزگشایی Def (خود ، cipher_text ، tag_mac ، کلید):

        #تلاش كردن:

        # nonce = aes_cipher.nonce
        رمزگذاری = AES. جدید (کلید ، AES.MODE_GCM)
        cipher.update (ب "هدر")
        plain_text = cipher.decrypt_and_verify (cipher_text، tag_mac)

        #except ValueError:
        # چاپ (" n خطایی رخ داده است.")

اگر __name__ == '__main__':

    ابتکار = فرستنده ()