Azure Databricks中Python调用OpenSSL解密AES-256-CBC文件失败
解决Azure Databricks中Python调用OpenSSL解密AES-256-CBC文件时的"bad decrypt"错误
错误原因分析
- 核心问题:加密解密参数不匹配:原Shell加密命令明确指定了
-md md5作为密钥派生的哈希算法,且未启用PBKDF2(使用OpenSSL旧版密钥派生逻辑)。你的Python解密代码要么缺失-md md5参数,要么错误添加了-pbkdf2,导致密钥/IV派生结果与加密时完全不一致,触发"bad decrypt"。 - 函数变量引用错误:
run_openssl_command函数定义了input_file和output_file参数,但命令中却引用全局变量encrypted_input_file和output_decrypted_file,导致参数传递失效,可能使用了错误的文件路径。 - 文本模式处理二进制文件:原代码使用
text=True处理加密文件,会导致二进制内容被错误转码,干扰解密逻辑。
修正后的Python解密代码
# OpenSSL version on Azure Databricks: OpenSSL 1.1.1f 31 Mar 2020 import subprocess def run_openssl_command(input_file, output_file, random_key_file): # 构造与加密命令参数完全匹配的openssl解密命令 openssl_cmd = [ "openssl", "enc", "-d", "-a", "-aes-256-cbc", "-md", "md5", # 必须和加密时指定的哈希算法一致 "-in", input_file, # 使用函数传入的参数,修正变量引用错误 "-out", output_file, "-pass", f"file:{random_key_file}" ] # 用二进制模式执行命令,避免转码问题 result = subprocess.run(openssl_cmd, capture_output=True, text=False) # 检查执行结果 if result.returncode == 0: print("Decryption completed successfully.") else: print("Error occurred during decryption:") print(result.stderr.decode('utf-8')) if __name__ == "__main__": encrypted_input_file = "<encrypted_file.csv.dat>" output_decrypted_file = "<decrypted_data_file.csv>" random_key_file = "RANDOM.key" run_openssl_command(encrypted_input_file, output_decrypted_file, random_key_file)
关键修正点说明
- 添加
-md md5参数:加密时用该参数指定了密钥派生的哈希算法,解密时必须完全匹配,否则OpenSSL 1.1.1f会默认使用SHA-256,导致派生的密钥与加密时不一致。 - 移除
-pbkdf2参数:原加密命令未使用PBKDF2,解密时添加该参数会改变密钥派生逻辑,必然导致解密失败。 - 修复变量引用错误:函数内使用传入的参数而非全局变量,确保文件路径正确传递。
- 设置
text=False:加密文件为二进制格式,该参数避免subprocess错误转码二进制内容,后续手动解码stderr输出即可。
内容的提问来源于stack exchange,提问作者newstack
相关产品推荐
相关产品推荐

