# 机器学习的「反噬」：当 ML 用于密码破解，成功率竟然这么高！

### 我们将这样做

• 数据收集和准备

• 训练与评估

• 测试和误差分析（提高模型精度）

• 结论；GitHub 链接

1. 数据收集

2. 数据准备

QuickTime 将录制的音频保存为 MP4。首先我们需要将 mp4 转换为 wav，因为有很好的 Python 库可以处理 wav 文件。图 3 右上角子图中的每个峰值对应于一个击键）。

3. 训练和验证

model = tf.keras.models.Sequential([

# 1st convolution

tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),

tf.keras.layers.MaxPooling2D(2, 2),

# 2nd convolution

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),

tf.keras.layers.MaxPooling2D(2,2),

# 3rd convolution

tf.keras.layers.Conv2D(128, (3,3), activation='relu'),

tf.keras.layers.MaxPooling2D(2,2),

# 4th convolution

tf.keras.layers.Conv2D(128, (3,3), activation='relu'),

tf.keras.layers.MaxPooling2D(2,2),

# Flatten the results to feed into a DNN

tf.keras.layers.Flatten(),

tf.keras.layers.Dropout(0.5),

# FC layer

tf.keras.layers.Dense(512, activation='relu'),

# Output layer

tf.keras.layers.Dense(26, activation='softmax')

])

___________________________________________________________

Layer (type) Output Shape Param #

====================================

conv2d_4 (Conv2D) (None, 148, 148, 64) 1792

___________________________________________________________

max_pooling2d_4 (MaxPooling2 (None, 74, 74, 64) 0

___________________________________________________________

conv2d_5 (Conv2D) (None, 72, 72, 64) 36928

___________________________________________________________

max_pooling2d_5 (MaxPooling2 (None, 36, 36, 64) 0

___________________________________________________________

conv2d_6 (Conv2D) (None, 34, 34, 128) 73856

___________________________________________________________

max_pooling2d_6 (MaxPooling2 (None, 17, 17, 128) 0

___________________________________________________________

conv2d_7 (Conv2D) (None, 15, 15, 128) 147584

___________________________________________________________

max_pooling2d_7 (MaxPooling2 (None, 7, 7, 128) 0

___________________________________________________________

flatten_1 (Flatten) (None, 6272) 0

___________________________________________________________

dropout_1 (Dropout) (None, 6272) 0

___________________________________________________________

dense_2 (Dense) (None, 512) 3211776

___________________________________________________________

dense_3 (Dense) (None, 26) 13338

====================================

Total params: 3,485,274

Trainable params: 3,485,274

Non-trainable params: 0

4. 测试

### 怎样提高预测精度呢？

• 第一列包含实际的测试单词；

• 第二列包含相应的预测单词，其中各个字符用颜色编码以显示正确（绿色）和错误（红色）预测；

• 第三列只显示正确预测的字符，错误预测的字符替换为下划线（以便于可视化）。

### 模型存在的一些小 BUG

• 正常的打字速度→具有挑战性的信号处理（隔离单个击键）。因为在这项研究中，作者使用了较慢的速度敲写数据内容。

• 任何按键→具有挑战性的信号处理（大小写？Shift 功能键？…）。因为在这项研究中，作者只使用了小写字母（不包括大写字母、数字、特殊字符、特殊击键等）。

• 背景噪声→添加噪声。因为在本研究的记录数据时，只有一些车辆经过时会出现部分简单和轻微的背景噪声，但没有复杂的背景噪声（例如：餐厅背景噪声等）。

• 不同的键盘和麦克风设置+不同的人打字→更多的数据+数据增强+更大的网络+不同的网络架构可能有助于改进模型。

### 最终我们得到这样的结论

• 通过击键声音破解敲写内容是有可能实现的；

• 通过少量的数据和简单的 CNN 架构+拼写检查，我们可以获得不错的单词级准确率（本研究中为 8%）；

• 简单的拼写检查可以提高单词级别的准确性（在本例中从 1.5% 提高到 8%）；

• 误差与其他键的接近相关；

• 误差似乎与麦克风位置无关。