diff --git a/django/contrib/messages/storage/cookie.py b/django/contrib/messages/storage/cookie.py
index 30689dde3b..17bed82057 100644
--- a/django/contrib/messages/storage/cookie.py
+++ b/django/contrib/messages/storage/cookie.py
@@ -1,3 +1,4 @@
+import binascii
 import json
 
 from django.conf import settings
@@ -182,7 +183,7 @@ class CookieStorage(BaseStorage):
             # with:
             #   decoded = None.
             decoded = self._legacy_decode(data)
-        except json.JSONDecodeError:
+        except (binascii.Error, json.JSONDecodeError):
             decoded = self.signer.unsign(data)
 
         if decoded:
diff --git a/tests/messages_tests/test_cookie.py b/tests/messages_tests/test_cookie.py
index 9f82ce93e9..191ae6eba6 100644
--- a/tests/messages_tests/test_cookie.py
+++ b/tests/messages_tests/test_cookie.py
@@ -1,3 +1,4 @@
+import binascii
 import json
 import random
 
@@ -7,7 +8,7 @@ from django.contrib.messages.storage.base import Message
 from django.contrib.messages.storage.cookie import (
     CookieStorage, MessageDecoder, MessageEncoder,
 )
-from django.core.signing import get_cookie_signer
+from django.core.signing import get_cookie_signer, b64_decode
 from django.test import SimpleTestCase, override_settings
 from django.test.utils import ignore_warnings
 from django.utils.crypto import get_random_string
@@ -205,6 +206,23 @@ class CookieTests(BaseTests, SimpleTestCase):
         decoded_messages = storage._decode(encoded_messages)
         self.assertEqual(messages, decoded_messages)
 
+    def test_legacy_encode_decode2(self):
+        # RemovedInDjango41Warning: pre-Django 3.2 encoded messages will be
+        # invalid.
+        storage = self.storage_class(self.get_request())
+        expected_texts = ['Successfully signed in as admin@example.org']
+        messages = [Message(0, msg) for msg in expected_texts]
+        # Encode/decode a message using the pre-Django 3.2 format.
+        encoder = MessageEncoder()
+        value = encoder.encode(messages)
+        with self.assertRaises(binascii.Error):
+            b64_decode(value.encode())
+        signer = get_cookie_signer(salt=storage.key_salt)
+        encoded_messages = signer.sign(value)
+        decoded_messages = storage._decode(encoded_messages)
+        self.assertEqual(expected_texts, list(map(lambda x: x.message, decoded_messages)))
+
+
     @ignore_warnings(category=RemovedInDjango40Warning)
     def test_default_hashing_algorithm(self):
         messages = Message(constants.DEBUG, ['this', 'that'])
