Проблема в следующем: если с одной и той же базой одновременно работать из нескольких контекстов из одного процесса, то при деинициализации первого контекста ключ будет выгружен, и второй контекст будет выдавать ошибки.
В примере ошибка возникает потому, что деинициализация первого контекста (из функции encrypt) вызывается позже, когда запускается сборщик мусора, а в этот момент второй контекст уже инициализирован. То есть при принудительном вызове сборщика мусора ошибок не будет.
encryption();
GC.Collect(); // принудительный вызов сборщика мусора
decryption();
Вообще при работе с одной базой правильнее использовать один контекст. Дело в том, что при инициализации каждого контекста загружается ключ, и если, например, ключ хранится на токене, то пользователю придется каждый раз при инициализации вводить пин код, а если установлен пароль на ключ, то еще и пароль.