如何用Python跨语言提取BitLocker恢复密钥与标识符?
解决BitLocker恢复密钥与标识符提取问题
现有代码的问题分析
- 正则表达式范围过窄:原正则仅匹配了标识符和密钥的极小片段,无法覆盖完整内容
- 缩进匹配错误:示例文件中使用的是4个空格缩进,而非代码中的制表符
\t - 无捕获组却调用
group(1):原正则未定义捕获组,执行时会抛出IndexError - 未利用固定格式特征:BitLocker标识符和恢复密钥有固定格式,应该基于格式匹配而非依赖文本标签(适配多语言)
修正后的实现方案
BitLocker标识符是标准UUID格式(8-4-4-4-12长度的十六进制字符串),恢复密钥是8组6位数字拼接而成。我们可以直接基于这些固定格式编写正则,同时兼容任意空白缩进,完美适配多语言文本:
import re def extract_bitlocker_info(file_path): with open(file_path, 'r', encoding='utf-8') as file: content = file.read() # 匹配BitLocker标识符:UUID格式,忽略大小写,兼容任意空白前缀 identifier_pattern = r'\s*([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})' identifier_match = re.search(identifier_pattern, content, re.IGNORECASE) identifier = identifier_match.group(1) if identifier_match else None # 匹配恢复密钥:8组6位数字,连字符分隔,兼容任意空白前缀 recovery_key_pattern = r'\s*(\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6})' recovery_key_match = re.search(recovery_key_pattern, content) recovery_key = recovery_key_match.group(1) if recovery_key_match else None return identifier, recovery_key
关键说明
\s*:匹配任意数量的空白字符(空格、制表符都兼容),解决缩进格式问题- 标识符正则:严格匹配UUID格式,
re.IGNORECASE兼容大小写字母 - 密钥正则:精准匹配8组6位数字的拼接格式,确保只提取有效恢复密钥
- 编码指定:打开文件时指定
encoding='utf-8',避免多语言文本出现乱码
测试验证
用你提供的示例文件测试,函数会返回:
("F85E6660-52A8-43D9-B66Z-F61246666666", "222222-333333-444444-555555-666666-777777-888888-999999")
注:示例中的标识符包含Z,这不符合标准十六进制规则,若为输入笔误,修正为合法十六进制字符后仍可正常匹配。
内容的提问来源于stack exchange,提问作者Simplicissimus




