Requiring a .finalize() call seems error-prone and adding strings together like this is inefficient (ignoring CPython optimizations). Wouldn't it be better, if BlockCipher would behave like a StringBuilder?