Symmetrischen "KeyGenerator" schreiben

Mujahiddin

Top Contributor
Ich steh gerade total auf dem Schlauch!
Ich will eine Funktion schreiben, die mir 16 Zeichen lange Keys generiert (natürlich möglichst zufällig). Das ist ja an sich nicht schwer. Was mich grade richtig zum Nachdenken bringt, ist, dass dies auch symmetrisch sein soll.
Ich soll also 16 Zeichen eingeben können und herausfinden, ob das ein gültiger Key ist.
Allerdings weiß ich überhaupt nicht, wie das gehen könnte. Ich habe nicht mal einen Ansatz.

Und im Internet habe ich bereits nachgeguckt, das ist schon zu 99,99% mit "KeyGenerator für App" zugemüllt.

mit Hashes kann ich leider nicht arbeiten.
Ich habe nur "ansatzweise" eine "Idee" gehabt, aber bei Weitem kein zufriedenstellendes Ergebnis:

Java:
private static final String PREFIX = "XyZz";

public static String generateKey() {
	String s = randomString();
	String base64 = DatatypeConverter.printBase64Binary( s.getBytes() );
	byte[] b = base64.getBytes();
	String key = new BigInteger( 1, b ).toString( 16 );
	return key;
}

public static boolean valid(String key) {
	byte[] b = new BigInteger( key, 16 ).toByteArray();
	System.out.println( Arrays.toString( b ) );
	String orig = new String( b );
	orig = new String( DatatypeConverter.parseBase64Binary( orig ) );
	return orig.startsWith( PREFIX );
}

public static String randomString() {
	String ret = PREFIX;
	ret += (char) ( Math.random() * 94 + 32 );
	ret += (char) ( Math.random() * 94 + 32 );
	return ret;
}

Das Problem ist, dass jeder generierte Key mit "57486c61656" anfängt.
Außerdem gibt es hierbei nur 94*94 Variationen, die Variationen sollen aber mindestems im Milliardenbereich liegen.

Hat irgendjemand eine Idee oder kann mich auf eine Seite verweisen?
 

sMau90

Aktives Mitglied
Ich bin mir nicht so ganz sicher, ob ich dich richtig verstanden hab, aber du willst eine Art "CD-Key" Verhalten oder? Also du gibst einen Key ein, dein Programm kann entscheiden ob er gültig ist, wobei du gleichzeitig in der Lage bist, möglichst zufällig solche Keys zu generieren.
Falls ich es richtig verstanden habe könnten diese Seiten evtl. interessant sein:
Venish Joe - Serial Key Generation and Validation in Java
java - Serial keys: What to do? - Stack Overflow
Serial Generator And Validator - Java | Dream.In.Code

Guck dir evtl. auch mal den KeyGenerator von Java an, der kann recht viel evtl. findest du dort etwas was du verwenden kannst.
Alles komplett selbst zu machen, ohne ein bestehendes Kryptosystem zu nutzen geht natürlich auch, wird aber bedeutend mehr Arbeit.

Grüße,
sMau
 

kay73

Bekanntes Mitglied
Das Problem bei den vorgestellten Ansätzen ist, dass der Code zum Generieren ausgeliefert wird und damit der "KeyGen" zum Ausstellen von gültigen aber gefälschten Schlüsseln frei Haus kommt.

Anders ist das, wenn ein asymmetrisches Verfahren wie RSA verwendet wird und das ist definitiv machbar. Wir hatten vor einiger Zeit diesen Thread in dem das Thema breitgetreten wurde.

Demoutput:
Code:
Ein Schlüsselpaar...
private:22940117733726891
public:34410176972520049

Ein paar Seriennummern...
2EPAFVX3X1XIA0AJ (ok)
44Z12Z30MODMV12K (ok)
34N5N1ABNT80LCLL (ok)
3M3M0HWI52BRJURE (ok)
3YHGL1YW83Y5SYZJ (ok)
32AD7VMG50YFV786 (ok)
3SC0ADIUITS5B9VY (ok)
2APGCBIBZAX9T3W0 (ok)
3R7LOT34CF0LQ6F6 (ok)
2F4LMJT7HISQ80HE (ok)

Hier ist der Code, abgestellt auf die gewünschte Länge von 16 Zeichen.
  • Die Funktion
    Code:
    genKeyPair()
    darf natürlich nur ein einziges Mal ausgeführt werden und das Schlüsselpaar wird notiert.
  • Der privateKey bleibt geheim; der publicKey wird hart ins Produkt kodiert.
  • Nur die
    Code:
    verify()
    -Einzeiler kommen in das ausgelieferte Produkt.
Java:
import java.math.BigInteger;
import java.util.Random;

public class StupidRSA {

    private static final BigInteger E = BigInteger.valueOf(3L);

    final Random r = new Random();
    
    public static class KeyPair {

        public final BigInteger publicKey;
        public final BigInteger privateKey;

        public KeyPair(final BigInteger n, final BigInteger d) {
            this.publicKey = n;
            this.privateKey = d;
        }
    }

    public KeyPair genKeyPair() {

        int nTries = 0;
        do {
            try {
                boolean hasPrime = false;

                BigInteger p = BigInteger.ZERO;
                while (!hasPrime) {
                    p = BigInteger.probablePrime(28, r);
                    hasPrime = p.isProbablePrime(8);
                }

                hasPrime = false;
                BigInteger q = BigInteger.ZERO;
                while (!hasPrime) {
                    q = BigInteger.probablePrime(28, r);
                    hasPrime = p.isProbablePrime(8) && !(q.equals(p));
                }

                final BigInteger n = p.multiply(q);

                final BigInteger eTot = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
                final BigInteger d = E.modInverse(eTot);

                return new KeyPair(n, d);
            } catch (final ArithmeticException ex) {
            }
        } while (nTries++ < 20);

        throw new RuntimeException("Konnte kein Schluesselpaar erzeugen.");
    }

    public BigInteger hash(final BigInteger number) {
        return number.mod(BigInteger.valueOf(8379));
    }

    public BigInteger sign(final BigInteger number, final KeyPair kp) {
        return hash(number).modPow(kp.privateKey, kp.publicKey);
    }

    public boolean verify(final BigInteger message, final BigInteger signature, final BigInteger publicKey) {
        return hash(message).equals(signature.modPow(E, publicKey));
    }

    public String generateSerial(final KeyPair kp, final Random r) {
        int nTries = 0;
        do {
            final BigInteger message = BigInteger.probablePrime(28, r);
            if (message.toString(36).length() != 6) {
                continue;
            }

            final BigInteger sign = sign(message, kp);
            if (sign.toString(36).length() != 10) {
                continue;
            }

            return (message.toString(36) + sign.toString(36)).toUpperCase();
        } while (nTries++ < 100);

        throw new RuntimeException("Konnte keine Seriennnummer generieren");
    }

    public boolean verify(final String serial, final BigInteger publicKey) {
        return verify(new BigInteger(serial.substring(0, 6), 36), new BigInteger(serial.substring(6, 16), 36), publicKey);
    }

    public static void main(String[] args) {

        final StupidRSA s = new StupidRSA();

        final KeyPair kp = s.genKeyPair();
        System.out.println(String.format("Ein Schlüsselpaar...\n%1$s:%2$s\n%3$s:%4$s", "private", kp.privateKey, "public", kp.publicKey));

        final Random r = new Random();

        System.out.println("\nEin paar Seriennummern...");
        for (int i = 0; i < 10; i++) {
            final String serial = s.generateSerial(kp, r);
            System.out.println(serial + (s.verify(serial, kp.publicKey) ? " (ok)" : " NOK!"));
        }
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Keygenerator zur Pw verbesserung Allgemeine Java-Themen 3
U KeyGenerator not available: Allgemeine Java-Themen 17
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
H In jar Resources schreiben? Allgemeine Java-Themen 6
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
L Erste Schritte Ausdruck schöner schreiben? Allgemeine Java-Themen 8
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M In Textdatei schreiben Allgemeine Java-Themen 3
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
K Zusammenfassungen schreiben Allgemeine Java-Themen 2
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
M Makrocode von OO in Java schreiben Allgemeine Java-Themen 5
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
M Input/Output Datei Schreiben Allgemeine Java-Themen 3
V Eclipse Ich kann bei eclipse nicht schreiben Allgemeine Java-Themen 1
Tobse HTTP REST API's in SQL schreiben Allgemeine Java-Themen 1
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
M Methoden jRegistryKey und in die Regitrey schreiben Allgemeine Java-Themen 5
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
E wav Datei schreiben mit AudioInputStream Allgemeine Java-Themen 3
T Excel - mit jxf sprachabhängige Formeln schreiben Allgemeine Java-Themen 2
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4
W Schreiben/Lesen aus RS232 / jssc Allgemeine Java-Themen 0
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
L Input/Output Datei einlesen und Inhalt in Array schreiben Allgemeine Java-Themen 3
D Datei in Jar schreiben Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
O Entwicklungshandbuch schreiben Allgemeine Java-Themen 2
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
O Collections StringSplit und in anderen String schreiben Allgemeine Java-Themen 8
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
B Großes Projekt "gut" schreiben Allgemeine Java-Themen 22
F Sachen in datei schreiben Allgemeine Java-Themen 2
G Binäre Datei lesen / schreiben Allgemeine Java-Themen 9
M ImageJ: Mit PlugIn Weichzeichnungsfilter schreiben Allgemeine Java-Themen 9
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
A DOM Datei schreiben Allgemeine Java-Themen 3
F In ein Textfeld im Browser schreiben? Allgemeine Java-Themen 4
Chumax Datei als Admin schreiben Allgemeine Java-Themen 5
S Von einer ArrayList in die andere schreiben? Allgemeine Java-Themen 6
I Eigenes Mail-Programm schreiben Allgemeine Java-Themen 21
S eigene regEx schreiben Allgemeine Java-Themen 4
E Performanceverlust beim Schreiben von ResultSet in txt Datei Allgemeine Java-Themen 10
F In mitten einer Textdatei schreiben Allgemeine Java-Themen 7
B Java Plugin schreiben Allgemeine Java-Themen 11
R Datei zeilenweise lesen und schreiben Allgemeine Java-Themen 6
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
I kleines Wochenlohn-Programm schreiben Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
das-mo FunktionsParser schreiben Allgemeine Java-Themen 32
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
J HSSF - schreiben in und lesen aus vorhandener Datei Allgemeine Java-Themen 6
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
C Property-File lesen und schreiben Allgemeine Java-Themen 20
M Binäre Datei schreiben und lesen Allgemeine Java-Themen 4
T Properties Datei nicht jedes mal neu schreiben? Allgemeine Java-Themen 2
H excel einlesen und in db schreiben Allgemeine Java-Themen 2
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
kirchrath PCM als WAV schreiben bzw ogg-Vorbis zu WAV Allgemeine Java-Themen 2
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben