diff --git a/changes.md b/changes.md
--- a/changes.md
+++ b/changes.md
@@ -1,22 +1,33 @@
+# 0.5.1.0
+
+    - Add 'CiphertextIsWrongLength'
+    - Bump version bound on 'cryptonite'
+
 # 0.5.0.0
+
     - Add support for 'cryptoids-class'
 
 # 0.4.0.0
+
     - Expose 'cipherBlockSize'
     - Adjust 'Data.CryptoID.Poly' to allow for more dynamic padding
 
 # 0.3.0.0
+
     - Better exception type (does no longer leak private information)
     - 'Data.CryptoID.Poly' now supports padding the plaintext to a certain length before encryption
 
 # 0.2.0.0
+
     - Rename 'Data.CryptoID.Poly' to 'Data.CryptoID.ByteString'
     - Introduce 'Data.CryptoID.Poly' doing actual serialization
 
 # 0.1.0.1
+
     - Correct mistakes in the documentation
 
 # 0.1.0
+
     - Switch to using 'MonadThrow' instead of 'MonadError'
     - Introduce 'readKeyFile'
 
diff --git a/cryptoids.cabal b/cryptoids.cabal
--- a/cryptoids.cabal
+++ b/cryptoids.cabal
@@ -1,43 +1,47 @@
-name: cryptoids
-version: 0.5.0.0
-cabal-version: >=1.10
-build-type: Simple
-license: BSD3
-license-file: LICENSE
-maintainer: Gregor Kleen <aethoago@141.li>
-synopsis: Reversable and secure encoding of object ids as a bytestring
-category: cryptography
-author: Gregor Kleen <aethoago@141.li>
+-- This file has been generated from package.yaml by hpack version 0.28.2.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 2089e71d5c8505cf30f7eb17988883c373302227642b65199d4544ddf18541ab
+
+name:           cryptoids
+version:        0.5.1.0
+synopsis:       Reversable and secure encoding of object ids as a bytestring
+category:       cryptography
+author:         Gregor Kleen <aethoago@141.li>
+maintainer:     Gregor Kleen <aethoago@141.li>
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
 extra-source-files:
     changes.md
 
 source-repository head
-    type: git
-    location: https://git.rheperire.org/cryptoids/cryptoids
+  type: git
+  location: https://git.rheperire.org/cryptoids/cryptoids
 
 library
-    exposed-modules:
-        Data.CryptoID.Poly
-        Data.CryptoID.Poly.ImplicitNamespace
-        Data.CryptoID.ByteString
-        Data.CryptoID.ByteString.ImplicitNamespace
-    build-depends:
-        base >=4.10.1.0 && <4.11,
-        binary >=0.8.5.1 && <0.9,
-        bytestring >=0.10.8.2 && <0.11,
-        cryptoids-class >=0.0.0 && <0.1,
-        cryptoids-types >=0.0.0 && <0.1,
-        cryptonite ==0.24.*,
-        directory >=1.3.0.2 && <1.4,
-        exceptions >=0.8.3 && <0.9,
-        filepath >=1.4.1.2 && <1.5,
-        memory >=0.14.11 && <0.15
-    default-language: Haskell2010
-    default-extensions: RankNTypes DataKinds GeneralizedNewtypeDeriving
-                        ViewPatterns RecordWildCards FlexibleContexts FlexibleInstances
-                        MultiParamTypeClasses TypeFamilies ConstraintKinds
-    hs-source-dirs: src
-    other-modules:
-        Paths_cryptoids
-    ghc-options: -Wall -fno-warn-name-shadowing
-
+  exposed-modules:
+      Data.CryptoID.Poly
+      Data.CryptoID.Poly.ImplicitNamespace
+      Data.CryptoID.ByteString
+      Data.CryptoID.ByteString.ImplicitNamespace
+  other-modules:
+      Paths_cryptoids
+  hs-source-dirs:
+      src
+  default-extensions: RankNTypes DataKinds GeneralizedNewtypeDeriving ViewPatterns RecordWildCards FlexibleContexts FlexibleInstances MultiParamTypeClasses TypeFamilies ConstraintKinds
+  ghc-options: -Wall -fno-warn-name-shadowing
+  build-depends:
+      base >=4.9 && <5
+    , binary >=0.8.3 && <0.9
+    , bytestring >=0.10.8 && <0.11
+    , cryptoids-class >=0.0 && <0.1
+    , cryptoids-types >=0.0 && <0.1
+    , cryptonite >=0.23 && <0.26
+    , directory >=1.3.0 && <1.4
+    , exceptions >=0.8.3 && <0.11
+    , filepath >=1.4.1 && <1.5
+    , memory >=0.14.6 && <0.15
+  default-language: Haskell2010
diff --git a/src/Data/CryptoID/ByteString.hs b/src/Data/CryptoID/ByteString.hs
--- a/src/Data/CryptoID/ByteString.hs
+++ b/src/Data/CryptoID/ByteString.hs
@@ -123,6 +123,11 @@
     --   'CryptoCipher'
     --
     -- The length of the offending plaintext is included.
+  | CiphertextIsWrongLength ByteString
+    -- ^ The length of the ciphertext is not a multiple of the block size of
+    --   'CryptoCipher'
+    --
+    -- The offending ciphertext is included.
   | NamespaceHashIsWrongLength ByteString
     -- ^ The length of the digest produced by 'CryptoHash' does
     --   not match the block size of 'CryptoCipher'.
@@ -222,11 +227,16 @@
 decrypt (keyMaterial -> key) CryptoID{..} = do
   cipher <- cryptoFailable (cipherInit key :: CryptoFailable CryptoCipher)
   namespace <- namespace' (Proxy :: Proxy namespace)
+  when (ByteString.length ciphertext `mod` blockSize cipher /= 0) $
+    throwM $ CiphertextIsWrongLength ciphertext
   return $ cbcDecrypt cipher namespace ciphertext
 
--- | This instance is somewhat improper in that it works only for plaintexts whose length is a multiple of 'cipherBlockSize'
+-- | This instance is somewhat improper in that it works only for plain- and
+--   ciphertexts whose length is a multiple of 'cipherBlockSize'
 --
 -- Improper plaintext lengths throw 'PlaintextIsWrongLength'
+--
+-- Improper ciphertext lengths throw 'CiphertextIsWrongLength'
 instance ( MonadCrypto m
          , MonadCryptoKey m ~ CryptoIDKey
          , KnownSymbol namespace
