在这份教程中,我们将会学习到如何使用神经网络来恢复破损的密码。如果你对 DiscreteHopfield 网络算法不是很了解的话,你可以通过阅读这篇 教程 来加强了解。

在开始实验之前,我们需要先设置一个种子参数使所有实验结果都可以重现。但是,没有这个参数程序也能正常工作。

12345 import randomimport numpy as np np.random.seed(0)random.seed(0)

如果所安装的Python版本或库版本过低,导致你无法重现上面的结果,你可以自行安装我们在这份教程中所需要的库。

123456789 >>> import neupy>>> neupy.__version__\’0.1.0\’>>> import numpy>>> numpy.__version__\’1.9.2\’>>> import platform>>> platform.python_version()\’3.4.3\’

所有的代码同样在Python2.7的环境中编译通过。

数据转换

在建立用于存储和恢复密码的神经网络之前,我们需要先转换输入输出的数据。但是,仅仅对其编码是不够的,我们应当为输入数据设置一个固定长度以确保字符串之间的长度一致。我们也要预先决定使用什么编码方式,为了简单易懂,我们选择ASCII码。现在让我们来定义用于将数据转换成二进制列表的函数吧。

12345678910111213141516 def str2bin(text, max_length=30):    if len(text) > max_length:        raise ValueError(\”Text can\’t contains more \”                         \”than {} symbols\”.format(max_length))     text = text.rjust(max_length)     bits_list = []    for symbol in text:        bits = bin(ord(symbol))        # Cut `0b` from the beggining and fill with zeros if they        # are missed        bits = bits[2:].zfill(8)        bits_list.extend(map(int, bits))     return list(bits_list)

这个函数需要传入两个参数,第一个是我们需要对其编码的字符串,第二个则为设定传入字符串的最大长度。只有传入字符串的长度小于最大长度,程序才会继续执行。

然我们来看看 str2bin 的 输出情况

1234 >>> str2bin(\”test\”, max_length=5)[0, 0, 1, 0, 0, 0, 0, 0, 0, ... ]>>> len(str2bin(\”test\”, max_length=5))40

ASCII 编码使用八个字节来存放一个字符,而我们这里将每个字符串最大长度设置为5。所以我们的向量长度等于40。从第一个输出结果可以看到,第一组八个符号 00100000 在 ASCII 表中表示空格。

在完成密码恢复过程的预处理之前,我们得到的总是一个 二进制的的列表。所以在我们将数据存到神经网络里面之前,我们需要在定义个函数用来将列表中二进制转回字符串。(差不多与前一个函数功能相反)

1234567891011 def chunker(sequence, size):    for position in range(0, len(sequence), size):        yield sequence[position:position + size] def bin2str(array):    characters = []    for binary_symbol_code in chunker(array, size=8):        binary_symbol_str = \’\’.join(map(str, binary_symbol_codelass=\”crayon-h\”> = \’\’.join(map(str, binary_symbol_code\”font-weight: normal\”>在这份教程中,我们将会学习到如何使用神经网络来恢复破损的密码。如果你对 DiscreteHopfield 网络算法不是很了解的话,你可以通过阅读这篇 教程 来加强了解。

在开始实验之前,我们需要先设置一个种子参数使所有实验结果都可以重现。但是,没有这个参数程序也能正常工作。

12345 import randomimport numpy as np np.random.seed(0)random.seed(0)

如果所安装的Python版本或库版本过低,导致你无法重现上面的结果,你可以自行安装我们在这份教程中所需要的库。

123456789 >>> import neupy>>> neupy.__version__\’0.1.0\’>>> import numpy>>> numpy.__version__\’1.9.2\’>>> import platform>>> platform.python_version()\’3.4.3\’

所有的代码同样在Python2.7的环境中编译通过。

数据转换

在建立用于存储和恢复密码的神经网络之前,我们需要先转换输入输出的数据。但是,仅仅对其编码是不够的,我们应当为输入数据设置一个固定长度以确保字符串之间的长度一致。我们也要预先决定使用什么编码方式,为了简单易懂,我们选择ASCII码。现在让我们来定义用于将数据转换成二进制列表的函数吧。

12345678910111213141516 def str2bin(text, max_length=30):    if len(text) > max_length:        raise ValueError(\”Text can\’t contains more \”                         \”than {} symbols\”.format(max_length))     text = text.rjust(max_length)     bits_list = []    for symbol in text:        bits = bin(ord(symbol))        # Cut `0b` from the beggining and fill with zeros if they        # are missed        bits = bits[2:].zfill(8)        bits_list.extend(map(int, bits))     return list(bits_list)

这个函数需要传入两个参数,第一个是我们需要对其编码的字符串,第二个则为设定传入字符串的最大长度。只有传入字符串的长度小于最大长度,程序才会继续执行。

然我们来看看 str2bin 的 输出情况

1234 >>> str2bin(\”test\”, max_length=5)[0, 0, 1, 0, 0, 0, 0, 0, 0, ... ]>>> len(str2bin(\”test\”, max_length=5))40

ASCII 编码使用八个字节来存放一个字符,而我们这里将每个字符串最大长度设置为5。所以我们的向量长度等于40。从第一个输出结果可以看到,第一组八个符号 00100000 在 ASCII 表中表示空格。

在完成密码恢复过程的预处理之前,我们得到的总是一个 二进制的的列表。所以在我们将数据存到神经网络里面之前,我们需要在定义个函数用来将列表中二进制转回字符串。(差不多与前一个函数功能相反)

1234567891011 def chunker(sequence, size):    for position in range(0, len(sequence), size):        yield sequence[position:position + size] def bin2str(array):    characters = []    for binary_symbol_code in chunker(array, size=8):        binary_symbol_str = \’\’.join(map(