Algorithm 生成移位字符组合所需的算法

Algorithm 生成移位字符组合所需的算法,algorithm,combinatorics,Algorithm,Combinatorics,我知道我的TrueCrypt分区密码的确切顺序和长度,但我记不起哪些字符是通过Shift键上移的。我编写了一个perl脚本(比如CrackTC),它只是尝试一个文件中的所有密码,但我正在寻找一种算法来快速生成密码文件。密码为42个字符,因此任何建议都会有所帮助 我意识到我只需要改变数字和标点符号,所以只有17个字符需要改变 注意这不是一个家庭作业问题。因为每个字符都可以是上限或下限,相当于一位。你有42位。二进制计数,并根据二进制位的模式将字符设置为大写或小写。2到42的幂是一个非常大的数字!!

我知道我的TrueCrypt分区密码的确切顺序和长度,但我记不起哪些字符是通过Shift键上移的。我编写了一个perl脚本(比如CrackTC),它只是尝试一个文件中的所有密码,但我正在寻找一种算法来快速生成密码文件。密码为42个字符,因此任何建议都会有所帮助

我意识到我只需要改变数字和标点符号,所以只有17个字符需要改变


注意这不是一个家庭作业问题。

因为每个字符都可以是上限或下限,相当于一位。你有42位。二进制计数,并根据二进制位的模式将字符设置为大写或小写。2到42的幂是一个非常大的数字!!太大了,用蛮力找不到!祝你好运

因为每个字符可以是上限或下限,相当于一位。你有42位。二进制计数,并根据二进制位的模式将字符设置为大写或小写。2到42的幂是一个非常大的数字!!太大了,用蛮力找不到!祝你好运

假设您必须尝试所有组合,并且每个密码尝试由单个字符分隔,那么42个字符密码的所有可能大写的密码文件的长度将为189 TB。您可能不希望直接从文件工作


我选择的算法是二进制计数算法,但不是切换单个位,而是切换单个字符的大小写。我强烈建议用你记忆中的经验法则缩小范围(比如:肯定有5个以上的大写字母,40个以下的大写字母)。

假设你必须尝试所有组合,并且每个密码尝试由一个字符分隔,42个字符密码的所有可能大写的密码文件长度为189 TB。您可能不希望直接从文件工作

我选择的算法是二进制计数算法,但不是切换单个位,而是切换单个字符的大小写。我强烈建议你用你记得的经验法则缩小范围(比如:肯定有5个以上的大写字母,40个以下的大写字母)。

快速python脚本:

def isShiftable(c):
    return not c in "123456789"

def generate(str, i=0):
    if len(str) <= i:
        print "".join(str)
    else:
        if isShiftable(str[i]):
            str[i]=str[i].upper()
            generate(str, i+1)
            str[i]=str[i].lower()
            generate(str, i+1)
        else:
            generate(str, i+1)

generate(list("testit123"))
def可换档(c):
在“123456789”中不返回c
def生成(str,i=0):
如果len(str)快速python脚本:

def isShiftable(c):
    return not c in "123456789"

def generate(str, i=0):
    if len(str) <= i:
        print "".join(str)
    else:
        if isShiftable(str[i]):
            str[i]=str[i].upper()
            generate(str, i+1)
            str[i]=str[i].lower()
            generate(str, i+1)
        else:
            generate(str, i+1)

generate(list("testit123"))
def可换档(c):
在“123456789”中不返回c
def生成(str,i=0):

如果len(str)不是真正的答案,但它可能会减少您的搜索空间:

  • 大写字母的最小值和最大值(可以是4和10)
  • 大写字母的最小和最大顺序(也可以是1和1)
  • 小写字母的最小和最大顺序(可以是2和15)
  • 某些组合的可能性比其他组合更大,应首先检查。例如,按大写字母的最大顺序对组合进行分组,并首先检查具有最小值的组合

    • 这不是一个真正的答案,但它可能会减少您的搜索空间:

      • 大写字母的最小值和最大值(可以是4和10)
      • 大写字母的最小和最大顺序(也可以是1和1)
      • 小写字母的最小和最大顺序(可以是2和15)
      • 某些组合的可能性比其他组合更大,应首先检查。例如,按大写字母的最大顺序对组合进行分组,并首先检查具有最小值的组合

        • 42个字母的密码,如果你知道这些字母,那么就有2^41个(也就是说:
          2199023 255 552
          )唯一的组合。如果你能在1秒内检查10万个,那么你就可以使用蛮力——至少需要61小时5分2秒

          你很可能不需要做那么多的工作。设x为大写字母数:

          • 如果你有
            7>x
            大写字母:(42!)/(6!36!)+(42!)/(5!37!)+(42!)/(4!38!)+(42!)/(3!39!)+(42!)/(2!40!)+(42!)/(1!41!)=
            6220767
            组合
          • 如果您有
            6
            大写字母:(42!)/(8!34!)+(42!)/(7!35!)=
            145008513
            组合
          如果可以自动执行检查过程并在一秒钟内检查
          2000
          元素,则在最坏情况下

          • 如果您有
            7>x
            大写字母,则需要51.84分钟
          • 如果您有
            6
            大写字母,则需要:20.14小时

          最有可能的情况是,您需要一些特殊的排列算法来有效地找到唯一的元素。这是一个相当复杂的问题,但我看不到任何其他方法,因为迭代2^41个元素是愚蠢的

          42个字母的密码,并且您知道这些字母,那么有2^41个(即:
          2199023 255 552
          )唯一的组合。如果你能在1秒内检查10万个,那么你就可以使用蛮力——至少需要61小时5分2秒

          你很可能不需要做那么多的工作。设x为大写字母数:

          • 如果你有
            7>x
            大写字母:(42!)/(6!36!)+(42!)/(5!37!)+(42!)/(4!38!)+(42!)/(3!39!)+(42!)/(2!40!)+(42!)/(1!41!)=
            6220767
            组合
          • 如果您有
            6
            大写字母:(42!)/(8!34!)+(42!)/(7!35!)=
            145008513
            组合
          如果可以自动执行检查过程并在一秒钟内检查
          2000
          元素,则在最坏情况下

          • 如果您有
            7>x
            大写字母,则需要51.84分钟
          • 如果您有
            6
            大写字母,则需要:20.14小时
          最有可能的情况是,您需要一些特殊的排列算法来有效地找到唯一的元素。这真是太好了