Une clé publique à laquelle tout ingénieur est exposé sur github. https://github.com/ユーザー名.keys Sera publié dans le monde entier.
Alors, regardez-moi la clé publique de @ umihico.
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFUMIHICoCb3Sy2n1qPXOxc2mFBqW9Hg0dRigxl2F3nW
C'est vrai. Vous avez correctement inséré votre propre nom d'utilisateur. J'ai créé une ligne unique qui continue de générer des clés jusqu'à ce que je trouve la chaîne spécifiée dans l'expression régulière, et je l'ai exécutée pendant environ une semaine. Cliquez ici pour une doublure.
@Ress m'a conseillé d'utiliser cd $ (mktemp -d)
pour réduire le temps d'E / S du disque. Je vous remercie!
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
Le processus de génération de clé au jugement et à la suppression des expressions régulières est effectué en parallèle avec xargs
en utilisant plusieurs processus. Dès qu'il est trouvé, il est absent de «while». En utilisant ed25519 de RSA, vous pouvez créer un grand nombre en peu de temps. De plus, la sécurité de la clé est améliorée et la longueur des caractères est courte.
@AKKYM nous a donné une suggestion de xargs
d'utiliser filter
pour accélérer le multi-processus. Les performances sont améliorées de 1,2 fois. Merci beaucoup. Macbook split
a des arguments différents de ceux de Linux, vous devez donc utiliser gsplit
qui peut être installé avec brew install coreutils
.
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» est le nombre de divisions = le nombre de processus, mais s'il s'écarte de la meilleure valeur en l'augmentant ou en la diminuant, la performance diminuera et sera à peu près la même que «xargs». Par contre, pour xargs
, même si le nombre de processus passe de 32 à 1000, il n'y a pas beaucoup de différence.
Si vous voulez que le serveur traite en arrière-plan en utilisant tmux etc., vous voulez être notifié, alors remplacez «écho trouvé» par, par exemple, l'API Webhook Incoming de Slack. Ce sera comme suit. (Version Xargs)
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
Soit dit en passant, s'il s'agit d'un serveur inactif, vous pouvez l'utiliser.Veuillez noter que EC2 sera facturé + α en fonction du paramètre de rafale du processeur. J'ai été facturé si EC2 de CPU Burst Unlimited violemment
Considérons maintenant la probabilité et le temps d'attente pour que la chaîne souhaitée se produise.
La probabilité qu'une chaîne base64 de 7 caractères aléatoire devienne accidentellement ʻumihico(insensible à la casse) est de
2 ^ 7/64 ^ 7`. Et comme ed25519 a une longueur de chaîne changeante de 43 caractères, on peut interpréter que cet essai peut être effectué 37 fois en même temps dans le cas de 7 caractères. En d'autres termes, la probabilité de frapper une fois est "0,0000001076841726899147%".
>>> 2**7/64**7*37
1.076841726899147e-09
La probabilité d'être trouvé en essayant 1 milliard de fois doit être soustraite de la probabilité de ne pas être trouvé 1 milliard de fois de suite. Il est de 65,9%.
>>> 1-(1-2**7/64**7*37)**(10**9)
0.6593302436744479
La formule suivante indique qu'il suffit d'essayer Z fois pour faire apparaître le caractère X avec une probabilité de Y. (Terminal de python3.6 ou version ultérieure)
>>> import math
>>> X=8
>>> Y=0.6
>>> Z=int(math.log(1-Y,1-2**X/64**X*(43-X+1)))
>>> f"{X}Pour les lettres{ '{:,}'.format(Z)}A l'heure{Y*100}%"
'Pour 8 caractères 27,985,342,058 fois 60.0%'
Oneliner exécute date
chaque fois que 1000 cas sont générés, donc si vous le regardez pendant un moment, vous pouvez deviner combien de cas vous pouvez essayer en une journée. Même si vous pouvez faire 1000 cas par seconde, il faudra 324 jours pour 27 milliards de fois pour atteindre 60% avec 8 caractères, il semble donc que les personnes avec des noms de 8 caractères ou plus ne soient pas réalistes. Pardon.
Et notez que la clé publique n'est, bien entendu, pas une chaîne aléatoire. Cependant, on suppose que la proposition de «probabilité de contenir une chaîne de caractères arbitraire» appelée nom peut être traitée comme aléatoire. J'ai essayé diverses choses et cela semble correct, mais ** ce n'est pas fondé. ** En d'autres termes, il est tout à fait possible qu'il y ait des chaînes qui ne se produisent pas même si vous essayez indéfiniment, ou des chaînes qui ont une probabilité plus déformée que aléatoire. J'aimerais en savoir plus sur ce domaine, mais ~~ je ne devrais plus passer d'heures de travail. ~~
J'ai reçu un supplément de @ angel_p_57 dans les commentaires. Il peut être traité comme aléatoire, mais après le premier I, il est limité aux lettres majuscules A à P. Merci beaucoup.
Merci pour la lecture.
référence
Recommended Posts