Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Código para adivinhar senhas

Olá pessoal, tudo bem ?

Tentei escrever um código que fizesse o seguinte:

  • 1-ler uma senha digitada pelo usuário
  • 2 - adivinhar a senha digitada pelo usuário e mostrar o resultado na tela.

Meu raciocínio foi o seguinte:

  • a- armazenar a senha digitada pelo usuário e separar a palavra, letra por letra em uma serie.
  • b- entregar uma serie com todas as letrar para comparacao
  • c - comparar cada letra da senha com cada letra do alfabeto, enquanto a ultima letra de cada seria for diferente uma da outra.
  • d- armazenar a letra do alfabeto em uma terceira variavel, sempre que as comparações forem iguais

o código ficou o seguinte:


import pandas as pd
import string

senha_input= input("Digite uma senha:")
tamanho =  len(senha_input)
senha = list(senha_input)
print(tamanho)
print(senha)

alfabeto = [ "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","z","w","y"]
i=0
adivinha = []

for i in range(0,(tamanho)):
    adivinha.append(("a"))
print("adivinha agora é :" , adivinha)

i=0
a=0
k = tamanho-1
while adivinha[k] != senha[k]:
  if (senha[a] != alfabeto[i]) is True:
    print("i é igual a  ", i, "a é igual a ", a , "diferente") #linha para imprimir na tela as interações e tentar identificar o erro
    i = i+1
  else:
    adivinha[a]=alfabeto[i]
    print( "a é igual a ", a ,"i é igual a  ", i,"igual", adivinha) #linha para imprimir na tela as interações e tentar identificar o erro

    i = 0
    a=a+1

print("A senha digitada é: ",adivinha)

Problema

inicialmente o código pareceu funcionar, entregando exatamente os caracteres da senha. Mas, Dependendo da senha digitada, o código simplesmente não consegue adivinhar. Nas imagens abaixo, ele acerta a senha ( "gabriel").

Código com resultado esperadoExemplo de palavras que ao serem imputadas como senha, geram erro: ("qualquercoisa","aba","ata","aha")

Insira aqui a descrição dessa imagem para ajudar na acessibilidade reparei no padrão em que se a letra A se repete, o código nao funciona Alguma sugestão ??

2 respostas
solução!

Boa Tarde, um programa que adivinha senha é interessante mas acho que essa aproximação não é tão boa Pelo que entendi do seu código você esta adivinhado letra por letra algo que você já sabe, fiz algo similar abaixo:

alfabeto  = [chr(n) for n in range(ord('a'), ord('z')+1)] #gera alfabeto minusculo
def advinhasenha(senha):
    for i in range(len(senha)):
        for j in range(len(alfabeto)):
            if senha[i] == alfabeto[j]:
                print(alfabeto[j],end="") #imprimir letra correta, podeira ser um append a uma lista com letras corretas 
    print() #pular linha

senha = input("Digite uma senha: ")
advinhasenha(senha)

Não consegui identificar oque esta exatamente errado no seu algoritmo, mas o re escrevi dessas maneira, não entendi muito bem oque esse "k", mas agora ele esta funcionado com senha que possuem caracteres repetidos.

senha_input= input("Digite uma senha:")
tamanho =  len(senha_input)
senha = list(senha_input)
print(tamanho)
print("".join(senha))

alfabeto = [ "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","z","w","y"]
i=0
adivinha = []

for i in range(0,(tamanho)):
    adivinha.append(("a"))
print("adivinha agora é : " , "".join(adivinha))

i=0 # Marca posição do alfabeto
a=0 # Marca posição da senha
k = tamanho-1 # ????
while a < tamanho-1:
  if senha[a] != alfabeto[i]:
    print(f'i = {i} e a = {a}') #linha para imprimir na tela as interações e tentar identificar o erro
    i = i+1
  else:
    adivinha[a]=alfabeto[i]
    print(f'a = {a} e i = {i} e a senha atual é {"".join(adivinha)}') #linha para imprimir na tela as interações e tentar identificar o erro
    i = 0
    a=a+1

print("A senha digitada é: ","".join(adivinha))

Talvez para seria mais interessante hashar a senha antes, já que normalmente senhas são hashadas, e comprar os hash aos hashs de um permutação, assim:

import hashlib

# função que gera todas as permutações possíveis
def permutacoe(letters, len_senha_atual):
    # Se a senha for de tamanho 1, retorna a senha
    if len_senha_atual == 1:
        return letters
    # Se a senha for maior que 1, retorna todas as permutações
    else:
        return [x+y for x in letters for y in permutacoe(letters, len_senha_atual-1)]

# função testa todas as combinações possíveis para uma senha
def advinhasenha(senha_hash):
    alfabeto = [chr(n) for n in range(ord('a'), ord('z')+1)]
    len_senha_atual = 1
    tentativas = 0
    while True:
    # Permutações geradas por um heap
        print(f'Tentando senha com {len_senha_atual} caracteres')
        for permutacao in permutacoe(alfabeto, len_senha_atual):
            senha_atual = ''.join(permutacao)
            print(f'Tentando senha {senha_atual}')
            tentativas += 1
            if hashlib.sha256(senha_atual.encode()).hexdigest() == senha_hash:
                print(f'Senha encontrada: {senha_atual}, em {tentativas} tentativas')
                return # posso retornar a senha
        len_senha_atual += 1

senha = input("Digite uma senha: ")
len_senha = len(senha)  
senha_hash = hashlib.sha256(senha.encode()).hexdigest()

print(f'Senha: {senha}')
print(f'Hash da senha: {senha_hash}')

advinhasenha(senha_hash)

valeu Nicolas, obrigado pela explicacao detalhada. agradeco pela ajuda