古早smp格式音频转成mp3

89 阅读2分钟

花了好多时间才找到的将smp格式转成mp3格式的代码,线上网站转都失败了,也找了些exe程序转出来也播放不了,估计是密钥不对。

操作步骤:

  1. 将下面的python代码保存成smptmp3.py文件,修改里面的密钥为你的smp文件的密钥(看第2步),修改smp文件目录,打开电脑的命令行工具,执行python3 smptmp3.py命令,等着就好了,会在smp文件目录的同级有一个新的解密目录,里面就是转好的mp3文件。
import os
import re
 
def clean_filename(filename):
    # 替换文件名中的非法字符
    filename = re.sub(r'[<>:"/\\|?*]', '_', filename)  # 替换Windows系统中的非法字符
    return filename
 
def xor_decrypt(data, key):
    key_length = len(key)
    decrypted_data = bytearray()
    for i in range(0, len(data), key_length):
        data_segment = data[i:i+key_length]
        if len(data_segment) == key_length:
            for j in range(key_length):
                decrypted_data.append(data_segment[j] ^ key[j])
        else:
            for j in range(len(data_segment)):
                decrypted_data.append(data_segment[j] ^ key[j])
            for j in range(key_length - len(data_segment)):
                decrypted_data.append(key[j] ^ 0)  # 使用 0 作为填充
    return decrypted_data
 
def decrypt_file(input_filename, output_filename, key):
    print(f"Attempting to decrypt {input_filename} to {output_filename}")
    if not os.path.exists(os.path.dirname(output_filename)):
        print(f"Creating directory {os.path.dirname(output_filename)}")
        os.makedirs(os.path.dirname(output_filename))
    with open(input_filename, 'rb') as infile, open(output_filename, 'wb') as outfile:
        data = infile.read()
        decrypted_data = xor_decrypt(data, key)
        outfile.write(decrypted_data)
        print(f'Decrypted {input_filename} to {output_filename}')
 
def decrypt_files_in_directory(src_dir, dest_dir, key):
    if not os.path.exists(dest_dir):
        os.makedirs(dest_dir)
     
    for root, dirs, files in os.walk(src_dir):
        for file in files:
            if file.endswith('.smp'):
                src_file_path = os.path.join(root, file)
                relative_path = os.path.relpath(src_file_path, src_dir)
                dest_file_path = os.path.join(dest_dir, relative_path).replace('.smp', '.mp3')
                # 清理文件名
                dest_file_name = clean_filename(os.path.basename(dest_file_path))
                dest_file_path = os.path.join(dest_dir, os.path.dirname(relative_path), dest_file_name)
                print(f"Processing file {src_file_path} to {dest_file_path}")
                decrypt_file(src_file_path, dest_file_path, key)
 
# 需要修改的密钥
key = [0x14, 0x13, 0x12, 0x11]
 
# 源目录和目标目录
src_dir = "/d/Downloads/俱乐部"  # 替换为你的父文件夹路径
 
dest_dir_suffix = '-解密'
dest_dir = src_dir + dest_dir_suffix  # 新文件夹的路径
 
# 开始解密
decrypt_files_in_directory(src_dir, dest_dir, key)

2.如何获取smp文件的密钥

windows电脑的话就用WinHex程序打开,Mac电脑可以在Appstore下载Hex Fiend,读取smp文件的16进制数据

图中是Hex Fiend打开看到的数据,密钥就是前面重复的部分 0x14 0x13 0x12 0x11 就是密钥

Hex Fiend打开smp文件