### LM Hash 加密算法过程

LM Hash 的整个加密过程可以分解为以下几个步骤：

1. 密码转换：
   - 首先，用户的明文密码会被转换为大写字母。这是 LM Hash 最大的安全漏洞之一，因为它会直接忽略密码中所有的大小写信息，大大降低了密码的复杂度。例如，“Password123”和“password123”在经过这一步处理后，都变成了“PASSWORD123”
   - 处理后的密码字符串，其长度不能超过 14 个字符。如果密码长度大于 14，则只取前 14 个字符
2. 密码填充与拆分：
   - 在将密码用于下一步加密之前，需要对它进行填充。如果处理后的密码长度小于 14 个字符，则会在其末尾使用空字符（`\x00`）进行填充，使其总长度达到 14 个字节
   - 填充后的 14 字节密码会被拆分为两个7 字节的字符串
3. 密钥生成：
   - 接下来，这两个 7 字节的字符串会被分别转换为两个 DES（Data Encryption Standard）密钥
   - 转换过程是这样的：每个 7 字节的字符串会被扩展为一个 8 字节的密钥，其中原始 7 个字节的每个字节的低 7 位用于组成密钥的 56 位有效密钥，剩下的 16 位则作为奇偶校验位
4. DES 加密：
   - 这两个 56 位的 DES 密钥会分别用来加密一个固定的字符串，这个字符串是“KGS!@#$%”。
   - DES 算法会以ECB（Electronic Codebook）模式对这个字符串进行加密
5. 结果拼接：
   - 最后，将两个 DES 加密后得到的 8 字节结果拼接起来，就得到了一个 16 字节（32 个十六进制字符）的 LM Hash

LM Hash 的弱点

通过上述步骤可以看出，LM Hash 的设计存在多个严重的安全缺陷，这也是为什么它早已被淘汰的原因：

- 不区分大小写： 这使得攻击者可以忽略大小写进行暴力破解，显著降低了密码空间的复杂度
- 固定填充和拆分： 无论密码长度如何，最终都是两个 7 字节的字符串。这意味着任何长度小于 8 个字符的密码，其第二个 7 字节的字符串都是相同的（全部由空字符填充）。攻击者只需破解前半部分，就可以得到密码
- 使用弱算法 DES： DES 算法本身已经很脆弱，并且这里的加密是针对一个固定的、公开的字符串“KGS!@#$%”，这为攻击者提供了巨大的便利，因为他们可以预先计算出所有可能的哈希值，然后进行彩虹表攻击（Rainbow Table Attack）