本帖最后由 KeKeBB0609 于 2024-5-29 14:14 编辑
坛友发布了一个悬赏,需求是将SMP文件转换MP3,虽然我已给出成品但我觉得还是分享一下方法。
这里仅针对于简单的加密。
由于异或操作是可逆的,那我们可以通过使用相同的密钥来进行异或操作解密数据。
这个是文件内容
我们可以看到文件头部为CF 4C 51 8B 86 08 62 88
一般MP3格式文件的头部为49 44 33 03 00 00 00 00
看到连续的0了吧49 44 33 03 00 00 00 00
我们先来解释一下异或操作是什么
异或运算是对于二进制进行运算的所以在运算时是对二进制位进行操作
异或操作是对于两个二进制位进行对比,相同则为0,不同则为1
那么我们就得0与未知数X的二进制值对比都等于X,所以,参考正常的MP3文件的头部值有00,我们就可以得出秘钥为86 08 62 88
那么我们就可以根据得到的秘钥进行异或操作
以下是操作方法:
一、将16进制数转换成二进制数:
CF->11001111
4C->01001100
51->01010001
8B->10001011
86->10000110
08->00001000
62->01100010
88->10001000
密文十六进制:CF 4C 51 8B 86 08 62 88->密文二进制:11001111 01001100 01010001 10001011 10000110 00001000 01100010 10001000
秘钥十六进制:86 08 62 88->秘钥二进制:10000110 00001000 01100010 10001000
二:将密文二进制与秘钥二进制进行对比:
密文:CF->11001111
秘钥:86->10000110
通过对比得出 十六进制值 | 二进制第一位 | 第二位 | 第三位 | 第四位 | 第五位 | 第六位 | 第七位 | 第八位 | CF | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 86 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | T/F | 相同 | 不同 | 相同 | 相同 | 不同 | 相同 | 相同 | 不同 | 结果 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
完整密文:11001111 01001100 01010001 10001011 10000110 00001000 01100010 10001000
完整秘钥:10000110 00001000 01100010 10001000 10000110 00001000 01100010 10001000 根据相同则为0,不同则为1进行对比得出
得出结果:10010010 10001000 01100110 00000110 00000000 00000000 00000000 00000000
结果与常规MP3文件的头文件相同,并且49 44 33 03ASCII码为ID3是mp3文件的标识,那就表示解密成功,将秘钥86 08 62 88对文件进行异或即可得出明文文件
至此解密结束。得到的文件为
以下为Python方法
[Python] 纯文本查看 复制代码 def xor_file(input_filename, output_filename, key):
with open(input_filename, 'rb') as infile, open(output_filename, 'wb') as outfile:
key_index = 0
while True:
byte = infile.read(1)
if not byte:
break # 如果到达文件末尾,则退出循环
byte = int.from_bytes(byte, byteorder='big')
xor_value = key[key_index] # 获取密钥的当前字节
xor_result = byte ^ xor_value # 对字节进行异或操作
outfile.write(xor_result.to_bytes(1, byteorder='big')) # 将结果写回到文件
key_index = (key_index + 1) % len(key) # 更新密钥索引,循环使用密钥
# 使用给定的密钥
key = [0x86, 0x08, 0x62, 0x88]
input_filename = '01.smp' # 输入文件名
output_filename = '01.mp3' # 输出文件名
xor_file(input_filename, output_filename, key)
将key改为将要解密的smp文件的密匙,input_filename改为文件路径,output_filename改为要保存的文件路径即可。 |