Added encrypting and decrypting streams functionality and tests, refactored encrypting and decrypting Ciphers. Added SymmetricEncryption class. Added custom exceptions (BuilderException, EncryptionException, DecryptionException) and updated AESKeyVersion and tests to use them.

Added functionality for encrypting and decrypting streams.
Added tests for encrypting and decrypting streams testing several inputs, all modes, all key lengths
Refactored encrypting and decrypting Ciphers - made them private local variables in AESKeyVersion and initialized them in the constructor (following the builder design pattern)

Added SymmetricEncryption class to allow you to do encryption and decryption of data using a symmetric key version. Deprecated old encryption and decryption methods in AESKeyVersion (now in SymmetricEncryption instead).
Added SymmetricEncryptionTest JUnit tests to test this functionality. Wrote JUnit tests before writing code for that class, following the test driven development model.

Added custom exceptions for building key versions, encryption, decryption  (BuilderException, EncryptionException, DecryptionException)
Changed AESKeyVersion to use custom K2 exceptions
Updated tests to use custom exceptions (BuilderException, EncryptionException, DecryptionException)
Added constructor taking just one parameter to K2Exception, (Throwable cause) to allow for exception chaining



Agreed - will do.