Здравствуйте. Запрашивать ключ с интервалом 1 месяц можно так:
import calendar
from datetime import date, timedelta
today = date.today()
days = calendar.monthrange(today.year, today.month)[1]
next_month_date = today + timedelta(days=days)
(
Python3 | Как к дате прибавить месяц?)
1. При вводе ключа записывать next_month_date в файл (желательно в бинарном виде, чтобы нельзя было поменять в notepad'е. Можно использовать pickle);
2. При очередном запуске программы читать сохранённый файл с датой и сравнивать её с текущей;
3. Если 1 месяц прошел, то переходить к п.1. Если нет - запускать основную программу
Отвечаю на Ваш второй вопрос (про распознавание 'своих' ключей).
Можно создать хэши (наподобие SHA) для всех ключей и хранить их в другом файле (можно в текстовом). При вводе ключа (перед выполнением п.1) вычислять хэш введённого ключа и пытаться найти его в файле с хэшами. Если он там есть - прекрасно, переходим к п.1. Если нет - показываем сообщение об ошибке.