1) Вы можете сохранить дату регистрации и сравнить ее с системной датой. конечно, тогда пользователи могут умерить дату. Раньше у меня было какое-то программное обеспечение, которое всегда сохраняло последнюю дату, которую он видел, и если кто-то перенес дату в прошлое, оно жаловалось и истекло. Вы могли бы сделать что-то подобное, но, конечно, это не так безопасно, как общение с сервером.
2) создайте формат для ключа активации, который содержит новый ключ, а также предыдущий ключ. таким образом, первый ключ, скажем, A, который подходит для общения с сервером и проверки, в порядке ли A. Новый ключ может выглядеть как AB, означая «Я заменяю A, добавляю еще один год активации, и меня зовут B, поэтому через год нам понадобится ключ, такой как BC». Вам придется немного подумать о том, как надежно кодировать это, но я вполне уверен, что оно может работать (например, вы можете зашифровать B с помощью A, тогда B можно использовать только на машине с кодом активации A).