"Round of MD5 hash value of 6-digit number password" Je l'ai essayé avec Python

Ça a l'air intéressant, alors j'ai essayé de participer

Ceci est un projet (?) Provenant de Créer un système de demande de mot de passe (réducteurs de clojure) et dispose d'une gamme réaliste de système de gestion de mot de passe de JAL. C'est une illusion de la méthode qui peut être réalisée avec.

Ne l'appelez pas maintenant ou obsolète.

Réalisations passées (sans ordre particulier)

Veuillez nous faire savoir s'il y a des omissions dans la liste. Je vais l'ajouter.

Un disque qui ne brille pas du tout est ajouté ici.

"Valeur de hachage MD5 ronde d'un mot de passe à 6 chiffres" par Python

Environnement d'exécution

os:windows7 Home Premium sp1 cpu:i7-4770T @2.50GHz Python:3.4.1(Anaconda 2.0.1 (64-bit))

Code source

Puisqu'il s'agit de Python3, il y a du travail pour convertir la chaîne de caractères en une chaîne d'octets. Le processeur a 8 cœurs, mais le nombre de parallèles est de 4. Le code que j'ai utilisé peut être trouvé ici [https://github.com/soyiharu/md5_time_trial).

Version à filetage unique

hash_single.py


import time
import hashlib
import sys

def main():
    argv = sys.argv[1:]
    if len(argv) != 2:
        sys.exit(0)

    salt = argv[0]
    hash = argv[1]
    
    start = time.time()
    for i in range(1000000):
        pw = "{0}${1:06d}".format(salt, i).encode("utf-8")
        tmp = hashlib.md5(pw).hexdigest()
        if hash == tmp:
            print("match[{0:06d}]".format(i))
    end = time.time()
    print("elapsed time:{0}s".format(end - start))
    
if __name__ == "__main__":
    main()

Version multithread

hash_parallel.py


import time
import hashlib
import sys
from multiprocessing import Pool
from itertools import repeat

def calc_hash(arg):
    hash, salt, i = arg
    tmp = hashlib.md5("{0}${1:06d}".format(salt, i).encode("utf-8")).hexdigest()
    return hash == tmp
    
def main():
    argv = sys.argv[1:]
    if len(argv) != 2:
        sys.exit(0)

    salt = argv[0]
    hash = argv[1]
    
    start = time.time()
    
    pool = Pool(4)
    result = pool.map(calc_hash, zip(repeat(hash), repeat(salt), range(1000000)))
    index = result.index(True)
    print("match[{0:06d}]".format(index))
    
    end = time.time()
    print("elapsed time:{0}s".format(end - start))
    
if __name__ == "__main__":
    main()

Méthode d'exécution

Répétez chaque 5 fois pour mesurer le temps.

python hash_single.py hoge 4b364677946ccf79f841114e73ccaf4f
python hash_parallel.py hoge 4b364677946ccf79f841114e73ccaf4f

Résultat de la mesure

Première fois Deuxième fois Troisième fois 4e 5ème fois moyenne écart-type
Version unique 1.724097967 1.736099005 1.729099035 1.733099937 1.739099026 1.732298994 0.005891065
Version multi 1.086061954 1.098062992 1.080061913 1.113064051 1.085062027 1.092462587 0.013278723

L'unité est en secondes

Le temps d'exécution en parallèle est de 63% du non-parallèle ※référence "Arrondi de la valeur de hachage MD5 du mot de passe à 6 chiffres" Lors de l'utilisation d'OpenMP, le résultat de l'exécution (numéro parallèle 4) était de 0,912 s même s'il a été légèrement modifié en fonction de Kita jusqu'à 0,70 seconde. (Code source)

Résumé

Puisque le temps d'exécution n'est qu'environ 63% en parallélisation, c'est du tout en termes de parallélisation, mais je pense que Python a travaillé dur car j'ai rattrapé la différence d'environ 16% par rapport au cas de c. On peut dire que c est inutile.

Post-scriptum (23/09/2014)

J'ai appris l'existence d'un bytearray. La chaîne de caractères python et la chaîne d'octets ne peuvent pas être modifiées, mais le bytearray peut être modifié. En utilisant cela, j'ai pensé que ce serait plus rapide si je ne recréais que la partie du nombre à 6 chiffres sans recréer la chaîne d'octets entière à chaque fois dans la version à un seul thread, mais ce n'était qu'environ 0,1 seconde plus rapide, pas autant que je m'y attendais. fait.

Je publierai les modifications pour que vous puissiez voir ce que vous avez fait.

python


from itertools import product
pw = bytearray("{0}${1:06d}".format(salt, 0).encode("utf-8"))  #Préparer bytearray
for i, value in enumerate(product(b'0123456789', repeat=6)):
    pw[-6:] = value  #Changer uniquement la partie numérique

Après tout, si vous voulez poursuivre la vitesse, peut-être C / C ++.

Recommended Posts

"Round of MD5 hash value of 6-digit number password" Je l'ai essayé avec Python
J'ai essayé des centaines de millions de SQLite avec python
Je n'ai pas le sens du "quiz demandant un sens de l'investissement", alors j'ai essayé de le résoudre avec la force brute (simulation Python Monte Carlo)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai essayé webScraping avec python.
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
Livre Wrangle x Python Je l'ai essayé [2]
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
Livre Wrangle x Python Je l'ai essayé [1]
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
# J'ai essayé quelque chose comme Vlookup avec Python # 2
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
Lorsque j'ai essayé de changer le mot de passe root avec ansible, je ne pouvais pas y accéder.
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé Flask avec des conteneurs distants de VS Code
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
[Python Data Frame] Lorsque la valeur est vide, remplissez-la avec la valeur d'une autre colonne.
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②