Грубая сила мой пароль GPG - PullRequest
1 голос
/ 05 марта 2012

Глупо, я забыл свой пароль gpg.

Я знаю, что пароль состоит из трех из шести строк, соединенных "_".

Возможны (скажем,) «1», «2», «3», «4», «5» и «6».

Допустим, пароль на самом деле «2_5_3».

Как выполнить циклчерез все комбинации?Не должно быть дубликатов (т. Е. «2_2_4» не является действительным паролем)!

Я пытаюсь написать это на Perl, но не знаю, с чего начать.Псевдокод - это хорошо.

Заранее большое спасибо,

ОБНОВЛЕНИЕ: Хорошо, теперь все работает.

Не так элегантно, как некоторыерешений ниже ...

#!/usr/bin/perl

use strict;
use warnings;

my @possibilities=("111","222","333","444","555","666","777");

my $size=scalar(@possibilities);
print $size."\n";

for(my $i=0;$i<$size;$i++){
        for(my $j=0;$j<$size;$j++){
                for(my $k=0;$k<$size;$k++){
                        if($i==$j || $j==$k || $i==$k){

                        }else{
                                print $i."_".$j."_".$k."\n";
                        }
                }
        }
}

Ответы [ 3 ]

10 голосов
/ 05 марта 2012

Вот способ сделать это с помощью Perl:

my @l = glob "{1,2,3,4,5,6}_{1,2,3,4,5,6}_{1,2,3,4,5,6}";
@l = grep{!/(\d)[_\d]*\1/}@l;
3 голосов
/ 05 марта 2012

Обычно вам нужно три цикла for для итерации по каждому слову (или многоиндексному). Поскольку вы хотите убедиться в отсутствии дубликатов, вы должны их пропустить (код Python):

names = ["abc","def","ghi","jkl","mno","pqr"]

for x in names:
    for y in names:
        if y in [x]: # word already used?
            continue # skip duplicates
        for z in names:
            if z in [x,y]: # word already used?
                continue   # skip duplicates
            print(x+"_"+y+"_"+z)

ОБНОВЛЕНИЕ: Perl-код (самый первый, который я когда-либо писал, так что я думаю, что это брутто на глаз разработчика Perl ...)

use strict;
use warnings;

my @words = ("abc","def","ghi","jkl","mno","pqr");
foreach my $w1 (@words){
    foreach my $w2(@words){
        next if $w1 eq $w2;
        foreach my $w3(@words){
        next if $w3 eq $w1;
        next if $w3 eq $w2;
            print $w1.'_'.$w2.'_'.$w3."\n";
        }
    }
}
1 голос
/ 19 июля 2013

Для этого есть модуль - Алгоритм :: Комбинаторика .

...