蛮力我的gpg密码

时间:2012-03-05 10:27:14

标签: algorithm perl gnupg

愚蠢的是,我忘记了我的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 个答案:

答案 0 :(得分:10)

这是使用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;

答案 1 :(得分:3)

基本上你需要三个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";
        }
    }
}

答案 2 :(得分:1)

有一个模块 - Algorithm::Combinatorics