Если программа может что-то расшифровать, значит программе доступен ключ для расшифровки, значит ключ доступен юзеру от имени которого эта программа запущена в системе, значит это юзер имеет возможность расшифровать документ. В любом случае приходим к необходимости разделять доступ на уровне ОС и настраивать права. Можно, конечно, запускать какой-то серверный процесс от имени одного юзера, которому доступен ключ, и подключаться к нему клиентом от имени юзера, которому ключ не доступен. Но такую систему еще надо разработать, готовое решения вы вряд ли найдете.