diff --git a/django/core/signing.py b/django/core/signing.py
index 6fc76bc..d99dd5a 100644
--- a/django/core/signing.py
+++ b/django/core/signing.py
@@ -43,7 +43,7 @@ from django.conf import settings
 from django.core.exceptions import ImproperlyConfigured
 from django.utils import baseconv
 from django.utils.crypto import constant_time_compare, salted_hmac
-from django.utils.encoding import smart_bytes
+from django.utils.encoding import force_bytes, force_str, force_text
 from django.utils.importlib import import_module
 
 
@@ -62,12 +62,12 @@ class SignatureExpired(BadSignature):
 
 
 def b64_encode(s):
-    return base64.urlsafe_b64encode(smart_bytes(s)).decode('ascii').strip('=')
+    return base64.urlsafe_b64encode(force_bytes(s)).decode('ascii').strip('=')
 
 
 def b64_decode(s):
     pad = '=' * (-len(s) % 4)
-    return base64.urlsafe_b64decode(smart_bytes(s + pad)).decode('ascii')
+    return base64.urlsafe_b64decode(force_bytes(s + pad)).decode('ascii')
 
 
 def base64_hmac(salt, value, key):
@@ -123,7 +123,7 @@ def dumps(obj, key=None, salt='django.core.signing', serializer=JSONSerializer,
 
     if compress:
         # Avoid zlib dependency unless compress is being used
-        compressed = zlib.compress(smart_bytes(data))
+        compressed = zlib.compress(force_bytes(data))
         if len(compressed) < (len(data) - 1):
             data = compressed
             is_compressed = True
@@ -160,9 +160,10 @@ class Signer(object):
         return base64_hmac(self.salt + 'signer', value, self.key)
 
     def sign(self, value):
-        return '%s%s%s' % (value, self.sep, self.signature(value))
+        return force_str('%s%s%s' % (value, self.sep, self.signature(value)))
 
     def unsign(self, signed_value):
+        signed_value = force_text(signed_value)
         if not self.sep in signed_value:
             raise BadSignature('No "%s" found in value' % self.sep)
         value, sig = signed_value.rsplit(self.sep, 1)
