Authorizing Users - Codes with a Non-Trivial Pattern

I have a request where a client wants to issue codes so only authorized users can run the CIQ DF.

I don't want to do a web connection. I want codes to expire. The client doesn't need unique codes for everyone - he isn't worried about people sharing activation codes. Just wants to update the valid code every few months.

Here is my thought. I'll add a  random constant in the DF. Say: "const SEED = 45;". Only codes that are a multiple of that SEED are valid. The code expires if it is less than the # days since the system epoch (1-Jan-1970), which is 18268 as of today.

===========

Examples:

Code 18315 is valid (modulo 45 = 0). And it is good for 45 more days from today.

Code 18405 is also valid. And is good an additional 90 days.

===========

The only issue with this is that an observant user could easily figure out that the codes are increments of 45. And then easily extend their use of the DF. I don't think my client would mind - but I think there is a way to do this.

I'm trying to figure out a math function in which the code naturally expires after a certain date (or a certain number of days), and the pattern for subsequent codes are not trivial to figure out.

Any ideas?

-- Dave