public/private Key? Ich denke, du meinst eher Klartext und Schlüsseltext? Gerade wenn man Fachbegriffe verwendet, sollte man sich ihrer Bedeutung sicher sein, sonst ist es besser und oft korrekter, es in Umgangssprache zu umschreiben. Musste ich nur mal bemerken.
Was du mit deiner Rechnung meinst, weiß ich gerade nicht, aber hier mal meine Gedanken:
AES zu benutzen ist eine gute Idee. Es ist das naheliegende und das was man immer tun sollte, wenn man keine sehr guten Gründe dagegen hat. Gut, du möchtest also verifizieren, ob ein Key korrekt ist und du möchtest in der Lage sein, beliebig viele, korrekte Keys zu generieren.
Wie wäre es hiermit: AES hat 128 Bit große Blöcke. In Hexdezimaler Schreibweise sind das 32 Ziffern, mit 32 verschieden Zeichen (Buchstaben + ein paar Zahlen, ohne 0 und O um Verwechslungen zu vermeiden) hättest du noch 26 Ziffern, mit 64 Zeichen (Alphabet groß/klein, Zahlen n paar Sonderzeichen) noch 22. In der Hexdarstellung kann man einen Block wunderbar kodieren, der CD Key ist dann zwar nervig lang, aber ok.
Jetzt ist die Frage, wie du den Key überprüfen kannst. Nun, wichtig ist, dass es nur wenige Keys gibt, die richtig sind, denn sonst könnte man einfach raten. Sehr einfach wäre folgendes Verfahren: Du sagst einfach, dass jede Zahl, die durch 2^64 teilbar ist, ein gültiger Key ist. Die letzten 64 Bit in deinem AES Block sind also alle 0, die davor beliebig. Diesen Block verschlüsselst du jetzt, und der verschlüsselte Block ist dann der CD-Key. Zur Überprüfung wird der Key wieder entschlüsselt und die letzten 64 Bit betrachtet.
Somit kannst du sehr einfach beliebig viele (bis zu 2^64, also unsinnig viele) CD-Keys generieren, und genauso einfach überprüfen. Ein Angreifer kann aber von beliebig vielen gesammelten Keys nicht auf weitere schließen. Und durch ausprobieren hat er nur eine Erfolgschance von 2^-64.
Da wir den CD-Key entschlüsseln können müssen, brauchen wir leider die vollen 128 Bit als CD Key. Dafür ist das Verfahren aber auch extrem sicher, da gegen AES noch keine brauchbaren Angriffe bekannt sind. Durch den EInsatz eines anderen Verfahrens könnte man aber auch mit kleineren Blockgrößen und somit kürzeren Keys auskommen.