import
os
import
re
def
clean_filename(filename):
filename
=
re.sub(r
'[<>:"/\\|?*]'
,
'_'
, filename)
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
)
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
=
[
0x9E
,
0x24
,
0x96
,
0x49
]
src_dir
=
"C:\\Users\\Administrator\\Desktop\\火火兔"
dest_dir_suffix
=
'-解密'
dest_dir
=
src_dir
+
dest_dir_suffix
decrypt_files_in_directory(src_dir, dest_dir, key)