Реализация потоков в программе python - PullRequest
0 голосов
/ 02 мая 2020

Я не могу реализовать потоки в своем коде грубой силы, чтобы поддержать, кто-то, кто мне помогает? на данный момент я только что добавил start_new_thread

, моя главная проблема в том, что я не могу распараллелить все, используя блокировки и разблокировки.

Я бы хотел, чтобы потоки пытались использовать разные ключи вместе, без использования одного и того же те, чтобы ускорить программу. Я думаю, что 3 или 4 темы подойдут.

import itertools # Libreria che permette di formulare tutte le possibili combinazioni di una lista di valori
import pandas as pd # Libreria standard pythoon che permette di sfuttare i dataframe
import time as ti # tempo di esecuzione
import threading
import _thread
from _thread import start_new_thread

def encrypt(plaintext, key, alphabet=' ABCDEFGHILMNOPQRSTUVZ'):     #Funzione per cifrare un testo preso in imput una stringa plaintext stringa da cifrare
    plaintext=plaintext.upper()                                     #Tutto maiuscolo
    crypted = ''                                            # Stringa cifrata al momento vuota
    key_length=len(key)                                             # Chiave per la cifratura  #quanto è lunga la chiave
    for i in range(len(plaintext)):                                 # ciclo for che permette di lavorare su ogni singolo carattere del testo da cifrare
        if type(key) is str:
            value = (alphabet.find(plaintext[i]) + alphabet.find(key[i % key_length])) % 22   # Associa alla lettera il numero corrispondente + il numero associato alla chiave e poi divide per 22
        else:
            value = (alphabet.find(plaintext[i]) + key[i % key_length]) % 22
        crypted += alphabet[value]
    return crypted

def decrypt(ciphertext, key, alphabet= ' ABCDEFGHILMNOPQRSTUVZ'):    # Funzione per decifrare il testo
    plaintext = ''
    key_length=len(key)
    for i in range(len(ciphertext)):
        if type(key) is str:
            value = (alphabet.find(ciphertext[i]) - alphabet.find(key[i % key_length])) % 22
        else:
            value = (alphabet.find(ciphertext[i]) - key[i % key_length]) % 22
        plaintext += alphabet[value]
    return plaintext

def brute_force(ciphertext, key_length, alphabet= ' ABCDEFGHILMNOPQRSTUVZ'):    #Funzione che permette attraverso continuie sostituzioni di trovare tutte le possibili combinazioni 
    alpha_list=list(alphabet)                   #Prende una stringa e lu muta in una lista di caratteri
    start = ti.time()                       #Start cronometro
    for i in itertools.product(alpha_list,repeat=key_length):       #uso itertool prendi tutti gli elementi della lista e dammi tutte le combinazioni di 5 elementi (combinazioni ammisibili)
        iterator+=1
        print('\rProvo tutte le chiavi composte da '+str(key_length)+' catteri: '+str(iterator)+'/'+str(len(alphabet)**key_length)+'         ',end='')  # Stato avanzamento della funzione
        key=''.join(i)                                      #Trasforma una lista di caratteri in una stringa
        msg=decrypt(ciphertext,key)                         #Decifra il messaggio con la chiave casuale di n caratteri che hai generato
        results.append([key,msg])                           #Restituisce la coppia chiave e messaggio decifrato ed inserisce questa coppia di valori in un vettore
    end=ti.time() - start
    minuti=''
    if (end // 60)>0:
        minuti=minuti.join(str(end//60)+' min. e ')
    print('\nElapsed time: '+minuti+'{:.2f}'.format(end % 60)+' sec.')
    end = pd.DataFrame(results)                             # Restituisce una struttura dati in grado di filtrare i risultati in maniera ottimale

def pwd_breaker(d,consonanti='BCDFGHLMNPQRSTVZ', vocali='AEIOU'):

    print('\n**********************************')
    print('|        PASSWORD BREAKER        |')
    print('**********************************')
    print('\nCombinazioni totali: '+str(len(d)))

    start = ti.time()
    print('Rimuovo combinazioni con 3 spazi consecutivi')
    df1=d[d[1].str.count('   ')==0]                           #Dataframe con in quale si seleziona tutte le righe che non hanno 3 spazi consecutivi 
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con 2 spazi consecutivi')
    df1=df1[df1[1].str.count('  ')==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con Q seguita da consonante o spazio')
    for i in itertools.product('Q', list(consonanti+' ')):
        df1=df1[df1[1].str.count(''.join(i))==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con Q seguita da vocali (esclusa la U)')
    for i in itertools.product('Q', list('AEIO')):
        df1=df1[df1[1].str.count(''.join(i))==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con Z seguita da consonante o spazio')
    for i in itertools.product('Z', list(consonanti+' ')):
        df1=df1[df1[1].str.count(''.join(i))==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con H seguita da consonante o spazio')
    for i in itertools.product('H', list(consonanti+' ')):
        df1=df1[df1[1].str.count(''.join(i))==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))

    start = ti.time()
    print('Rimuovo combinazioni con una consonante preceduta e seguita da spazio')
    for i in itertools.product(' ', list(consonanti),' '):
        df1=df1[df1[1].str.count(''.join(i))==0]
    print('Combinazioni totali: '+str(len(df1)))
    print('elapsed time (s): '+str(ti.time() - start))
    start = ti.time()
    print('Rimuovo combinazioni con 4 consonanti consecutive: ', end='')
    iterator=0
    for i in itertools.product(list(consonanti), repeat=4):
        df1=df1[df1[1].str.count(''.join(i))==0]
        iterator+=1
        print('\rRimuovo combinazioni con 4 consonanti consecutive ('+str(len(df1))+'): '+str(iterator)+'/'+str(len(consonanti)**4)+'         ',end='')
    print('\nCombinazioni finali: '+str(len(df1)))
    end=ti.time() - start
    minuti=''
    if (end // 60)>0:
        minuti=minuti.join(str(end//60)+' min. e ')
    print('\nElapsed time: '+minuti+'{:.2f}'.format(end % 60)+' sec.')
    df1.to_csv('lista.csv', index=False)
    print(df1)
    return df1

# =============================================================================
# TEST FUNZIONANTE
# =============================================================================


results=[] #risultto finale attacco
end=0
iterator = 0

testo='ECCO COSA SUCCEDE QUANDO CIFRI UN TESTO E TI DIMENTICHI LA CHIAVE DI CIFRATURA'
chiave='BARRA'
testo_cifrato=encrypt(testo, chiave)
ritorno=decrypt(testo_cifrato, chiave)
print(testo)
print(testo_cifrato)
print(ritorno)
inizio= ti.time()

'''
thread1 = threading.Thread(target=brute_force(testo_cifrato,5))
thread2 = threading.Thread(target=brute_force(testo_cifrato,5))

thread2.start()
thread1.start()

thread1.join()
thread2.join()
'''

start_new_thread(brute_force,(testo_cifrato,5,))
start_new_thread(brute_force,(testo_cifrato,5,))
start_new_thread(brute_force,(testo_cifrato,5,))

df2=pwd_breaker(end)
end=ti.time() - inizio
minuti=''
if (end // 60)>0:
    minuti=minuti.join(str(end//60)+' min. e ')
print('\nTEMPO TOTALE DI ESECUZIONE: '+minuti+'{:.2f}'.format(end % 60)+' sec.')

1 Ответ

0 голосов
/ 02 мая 2020

Чао Давиде, давай, пожалуйста, иди по методу чьямато «Грубая сила», но и практика, и то, и другое, и другие, и другие, но и другие.

За велоцизерное задание для получения многопоточности, многопоточности, изнурительной кодировки:

start_new_thread(brute_force,(testo_cifrato,5,))
start_new_thread(brute_force,(testo_cifrato,5,))
start_new_thread(brute_force,(testo_cifrato,5,))

effettui la stessa operazione tre volte ma non hai un controllo sulle chiavi provate quindi i thread проверено le stesse chiavi nella stessa преемственность ed il risultato sarà identifico ad un single-thread.

Una soluzione banale, scopo didattico, che mi viene in mente al volo potrebbe essere:

  • Всеобщее наследие детей и взрослых

  • Разделенные списки в sottoliste di eguale lunghezza (по возможности)

  • Passare ad ogni thread (uno per ogni sottolista generata) una sottolista contenente le chiavi da provare

Общеизвестный, общий вид, дипенде да те.

В этом режиме вы можете найти все, что вам нужно.

Бесконечный и общий код с различными вариантами в единственном экземпляре в режиме реального времени и в общедоступном виде. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...