Meu problema começou quando perdi a senha de um dos volumes de truecrypt que utilizo. Eu sabia que a senha desse volume seguia um padrão: uma combinação de várias palavras e códigos conhecidos por mim.
Como eu tinha em mente muitas palavras e códigos, gerar todas as combinações na mão e testar uma a uma poderia levar muito tempo (como também poderia ser uma das primeiras combinações).
Utilizei o código abaixo para gerar as 109600 combinações:
#!/usr/bin/python
import sys, itertools
lista = sys.argv[1:]
len_lista = len(lista)+1
if len_lista < 3:
print 'Passe uma lista de palavras separadas por espaco'
sys.exit()
for quantidade in range(1,len_lista):
for item in list(itertools.permutations(lista,quantidade)):
print ''.join(item)
Depois disso, o código abaixo testou as combinações a uma vergonhosa velocidade de 72 senhas por minuto e eu consegui ter a senha em pouco mais de 7 minutos (considerando que fazer isso na mão seria bem pior, estou satisfeito):
#!/usr/bin/python
import sys, subprocess
if len(sys.argv) != 3:
print 'Uso: ' + sys.argv[0] + ' arquivo.tc arquivo.senhas'
sys.exit()
truecrypt = "/Applications/TrueCrypt.app/Contents/MacOS/TrueCrypt"
volume = sys.argv[1]
lista_de_senhas = [linha.strip() for linha in open(sys.argv[2],'r')]
for senha in lista_de_senhas:
retcod = subprocess.call(truecrypt + ' --text --mount ' + volume + \
' --mount-options=ro --slot=10 --non-interactive \
--password=' + senha, shell=True,
stderr=subprocess.PIPE)
if retcod == 0:
print 'SENHA: ' + senha
sys.exit()
Pode não ser a melhor solução, mas resolveu meu problema. (-: