"Round of MD5-Hashwert des 6-stelligen Passworts" Ich habe es mit Python versucht

Es sieht interessant aus, also habe ich versucht mitzumachen

Dies ist ein Projekt (?), Das aus Erstellen eines Passwortabfragesystems (Clojure Reducer) und einer realistischen Reihe von JALs Passwortverwaltungssystemen stammt. Es ist eine Täuschung der Methode, die mit erreicht werden kann.

Nennen Sie es nicht jetzt oder veraltet.

Vergangene Erfolge (in keiner bestimmten Reihenfolge)

Bitte teilen Sie uns mit, ob die Liste Auslassungen enthält. Ich werde es hinzufügen.

Ein Datensatz, der überhaupt nicht leuchtet, wird hier hinzugefügt.

"Round-Round-MD5-Hashwert des 6-stelligen Passworts" von Python

Ausführungsumgebung

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

Quellcode

Da es sich um Python3 handelt, muss die Zeichenfolge in eine Byte-Zeichenfolge konvertiert werden. Die CPU hat 8 Kerne, aber die Anzahl der Parallelen beträgt 4. Den von mir verwendeten Code finden Sie hier [https://github.com/soyiharu/md5_time_trial].

Single-Thread-Version

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()

Multithread-Version

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()

Ausführungsmethode

Wiederholen Sie dies alle 5 Mal, um die Zeit zu messen.

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

Messergebnis

Erstes Mal Zweites Mal Drittes Mal 4 .. 5. Mal durchschnittlich Standardabweichung
Einzelversion 1.724097967 1.736099005 1.729099035 1.733099937 1.739099026 1.732298994 0.005891065
Multi-Version 1.086061954 1.098062992 1.080061913 1.113064051 1.085062027 1.092462587 0.013278723

Das Gerät ist Sekunden

Die parallele Ausführungszeit beträgt 63% der nicht parallelen ※Referenz "Rundung des MD5-Hashwerts des 6-stelligen Kennworts" Bei Verwendung von OpenMP betrug das Ausführungsergebnis (parallele Nummer 4) 0,912 Sekunden, obwohl es basierend auf der Kita bis zu 0,70 Sekunden geringfügig geändert wurde. (Quellcode)

Zusammenfassung

Da die Ausführungszeit bei der Parallelisierung nur etwa 63% beträgt, handelt es sich überhaupt um Parallelisierung, aber ich denke, dass Python hart gearbeitet hat, weil ich den Unterschied von etwa 16% zum Fall von c aufgeholt habe. Man kann sagen, dass c nutzlos ist.

Nachtrag (23.09.2014)

Ich habe von der Existenz eines Bytearrays erfahren. Die Python-Zeichenfolge und die Byte-Zeichenfolge können nicht geändert werden, aber das Bytearray kann geändert werden. Auf diese Weise dachte ich, dass es schneller wäre, wenn ich nur den 6-stelligen Zahlenteil neu erstellen würde, ohne jedes Mal die gesamte Byte-Zeichenfolge in der Single-Thread-Version neu zu erstellen, aber es war nur etwa 0,1 Sekunden schneller, nicht so viel wie ich erwartet hatte. tat.

Ich werde die Änderungen veröffentlichen, damit Sie sehen können, was Sie getan haben.

python


from itertools import product
pw = bytearray("{0}${1:06d}".format(salt, 0).encode("utf-8"))  #Bytearray vorbereiten
for i, value in enumerate(product(b'0123456789', repeat=6)):
    pw[-6:] = value  #Ändern Sie nur den Nummernteil

Wenn Sie die Geschwindigkeit verfolgen möchten, vielleicht C / C ++.

Recommended Posts

"Round of MD5-Hashwert des 6-stelligen Passworts" Ich habe es mit Python versucht
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe kein Gefühl für "Quiz fragen nach Investitionssinn", also habe ich versucht, es mit roher Gewalt zu lösen (Python Monte Carlo Simulation)
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Wrangle x Python Buch Ich habe es versucht [2]
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Wrangle x Python Buch Ich habe es versucht [1]
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
[Python Data Frame] Wenn der Wert leer ist, füllen Sie ihn mit dem Wert einer anderen Spalte.
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ② analysiert