[LINUX] Wenn Sie 1 Milliarde private Schlüssel erstellen, können Sie mit hoher Wahrscheinlichkeit einen öffentlichen Schlüssel einschließlich Ihres Namens erstellen.

Ein öffentlicher Schlüssel, dem jeder Ingenieur auf Github ausgesetzt ist. https://github.com/ユーザー名.keys Wird weltweit veröffentlicht.

Dann schauen Sie sich bitte mich an @ umihicos öffentlicher Schlüssel.

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFUMIHICoCb3Sy2n1qPXOxc2mFBqW9Hg0dRigxl2F3nW

Korrekt. Sie haben erfolgreich Ihren eigenen Benutzernamen eingefügt. Ich habe einen Einzeiler erstellt, der so lange Schlüssel generiert, bis ich die angegebene Zeichenfolge im regulären Ausdruck gefunden habe, und sie etwa eine Woche lang ausgeführt. Klicken Sie hier für einen Liner.

@Ress hat mir empfohlen, "cd $ (mktemp -d)" zu verwenden, um die E / A-Zeit der Festplatte zu reduzieren. Vielen Dank!

cd $(mktemp -d); while true; do seq 1000 | xargs -P 1000 -I NUM sh -c 'ssh-keygen -t ed25519 -f NUM.pem -N "" -C "" > /dev/null && if grep -vi umihico NUM.pem.pub > /dev/null; then rm NUM.pem NUM.pem.pub;fi' ; if find . -mindepth 1 | read; then  for f in *.pem.pub; do echo $f >> files.txt; done; test -f files.txt && head -n1 files.txt | xargs -I F echo found;  break; fi ; date ; done

Die Verarbeitung von der Schlüsselgenerierung bis zur Beurteilung und Löschung regulärer Ausdrücke erfolgt parallel zu "xargs" unter Verwendung mehrerer Prozesse. Sobald es gefunden wird, fehlt es in "while". Mit ed25519 von RSA können Sie in kurzer Zeit eine große Anzahl erstellen. Darüber hinaus wird die Sicherheit des Schlüssels verbessert und die Zeichenlänge ist kurz.

@AKKYM gab uns einen Vorschlag von "xargs", "filter" zu verwenden, um Multiprozesse zu beschleunigen. Die Leistung wird um das 1,2-fache verbessert. Vielen Dank. Macbook split hat andere Argumente als Linux, daher müssen Sie gsplit verwenden, das mit brown install coreutils installiert werden kann.

cd $(mktemp -d); while true; do seq 1000 | gsplit -u -n r/32 --filter 'while read i; do ssh-keygen -t ed25519 -f $i.pem -N "" -C "" > /dev/null && if grep -vi umihico $i.pem.pub > /dev/null; then rm $i.pem $i.pem.pub;fi; done' ; if find . -mindepth 1 | read; then  for f in *.pem.pub; do echo $f >> files.txt; done; test -f files.txt && head -n1 files.txt | xargs -I F echo found;  break; fi ; date ; done

"r / 32" ist die Anzahl der Unterteilungen = die Anzahl der Prozesse. Wenn es jedoch durch Erhöhen oder Verringern vom besten Wert abweicht, nimmt die Leistung ab und entspricht in etwa der von "xargs". Andererseits gibt es für "xargs" keinen großen Unterschied, selbst wenn die Anzahl der Prozesse von 32 auf 1000 geändert wird.

Wenn Sie möchten, dass der Server im Hintergrund mit tmux usw. verarbeitet wird, möchten Sie benachrichtigt werden. Ersetzen Sie daher "echo found" beispielsweise durch die Webhook Incoming API von Slack. Es wird wie folgt sein. (Xargs-Version)

cd $(mktemp -d); while true; do seq 1000 | xargs -P 1000 -I NUM sh -c 'ssh-keygen -t ed25519 -f NUM.pem -N "" -C "" > /dev/null && if grep -vi umihico NUM.pem.pub > /dev/null; then rm NUM.pem NUM.pem.pub;fi' ; if find . -mindepth 1 | read; then  for f in *.pem.pub; do echo $f >> files.txt; done; test -f files.txt && head -n1 files.txt | xargs -I F curl -s -X POST -d '{"text":"F"}' https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/zzzZZZzZzzZzzZZzz;  break; fi ; date ; done

Übrigens, wenn es sich um einen inaktiven Server handelt, können Sie ihn verwenden. Bitte beachten Sie, dass EC2 abhängig von der CPU-Burst-Einstellung + α berechnet wird. Ich wurde belastet, wenn EC2 von CPU Burst Unlimited gewaltsam platzt

Betrachten wir nun die Wahrscheinlichkeit und Wartezeit für das Auftreten der gewünschten Zeichenfolge. Die Wahrscheinlichkeit, dass eine zufällige 7-stellige base64-Zeichenfolge versehentlich "umihico" (ohne Berücksichtigung der Groß- und Kleinschreibung) wird, beträgt "2 ^ 7/64 ^ 7". Und da ed25519 eine sich ändernde Zeichenfolgenlänge von 43 Zeichen hat, kann interpretiert werden, dass dieser Versuch 37 Mal gleichzeitig mit 7 Zeichen durchgeführt werden kann. Mit anderen Worten, die Wahrscheinlichkeit eines einmaligen Treffers beträgt "0,0000001076841726899147%".

>>> 2**7/64**7*37
1.076841726899147e-09

Die Wahrscheinlichkeit, 1 Milliarde Mal gefunden zu werden, sollte von der Wahrscheinlichkeit abgezogen werden, 1 Milliarde Mal hintereinander nicht gefunden zu werden. Es ist 65,9%.

>>> 1-(1-2**7/64**7*37)**(10**9)
0.6593302436744479

Die folgende Formel besagt, dass Sie nur Z-mal versuchen müssen, um das X-Zeichen mit einer Wahrscheinlichkeit von Y erscheinen zu lassen. (Terminal von Python3.6 oder höher)

>>> import math
>>> X=8
>>> Y=0.6
>>> Z=int(math.log(1-Y,1-2**X/64**X*(43-X+1)))
>>> f"{X}Für Briefe{ '{:,}'.format(Z)}Manchmal{Y*100}%"
'Für 8 Zeichen 27,985,342,058 mal 60.0%'

Oneliner führt "Datum" jedes Mal aus, wenn 1000 Fälle generiert werden. Wenn Sie es sich also eine Weile ansehen, können Sie erraten, wie viele Fälle Sie an einem Tag versuchen können. Selbst wenn Sie 1000 Fälle pro Sekunde ausführen können, dauert es 27 Milliarden Mal 324 Tage, bis 60% mit 8 Zeichen erreicht sind. Es scheint also, dass Personen mit Namen mit 8 Zeichen oder mehr nicht realistisch sind. Es tut uns leid.

Und beachten Sie, dass der öffentliche Schlüssel natürlich keine zufällige Zeichenfolge ist. Es wird jedoch angenommen, dass der Satz "Wahrscheinlichkeit, eine beliebige Zeichenfolge zu enthalten", genannt Name, als zufällig behandelt werden kann. Ich habe verschiedene Dinge ausprobiert und es scheint richtig zu sein, aber ** es ist unbegründet. ** Mit anderen Worten, es ist durchaus möglich, dass es Zeichenfolgen gibt, die nicht auftreten, selbst wenn Sie es für immer versuchen, oder Zeichenfolgen, deren Wahrscheinlichkeit verzerrter als zufällig ist. Ich würde gerne mehr über dieses Gebiet erfahren, aber ~~ ich sollte keine Geschäftszeiten mehr verbringen. ~~

Ich habe eine Ergänzung von @ angel_p_57 in den Kommentaren erhalten. Es kann als zufällig behandelt werden, aber nach dem ersten I ist es auf Großbuchstaben A bis P beschränkt. Vielen Dank.

Danke fürs Lesen.

Gist

Referenz

Recommended Posts

Wenn Sie 1 Milliarde private Schlüssel erstellen, können Sie mit hoher Wahrscheinlichkeit einen öffentlichen Schlüssel einschließlich Ihres Namens erstellen.
Erstellen Sie Ihre eigene VPC mit einem einzigen öffentlichen Subnetz Nur mit boto
Bis Sie VPS mit Conoha ausleihen und den öffentlichen Schlüssel mit SSH authentifizieren können
Wenn ihr in der Scope-Küche das mit einem Rand machen könnt ~ ♪
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework