我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用 Python 从音频中提取摩斯密码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用 Python 从音频中提取摩斯密码

本人并非专业人士,在部分专业名词的表述上可能会出现错误,敬请谅解

前段时间在 BugKu 做题时碰到了这么一题 铁子,来一道 - Bugku CTF
(WriteUp 可见同学的博客 【BugKu】铁子,来一道_s1ameseL的博客-CSDN博客)
在解题过程中有一步,需要从音频中提取出摩斯密码。看了同学写的 WriteUp 后,我突发奇想,决定写一个自动从音频中提取摩斯密码的程序,于是就有了这么个工具

Github地址: https://github.com/CrystalMoling/MorseAudioDecoder

编写过程

1.载入音频

在这里使用的是 python 的 wave

# 加载音频audio = wave.open(sys.argv[1], 'rb')# 读音频信息params = audio.getparams()print(params)n_channels, _, sample_rate, n_frames = params[:4]# 读频谱信息str_wave_data = audio.readframes(n_frames)audio.close()# 将频谱信息转为数组wave_data = np.frombuffer(str_wave_data, dtype=np.short).T

2.提取数据

计算出横轴的时间轴后,使用 pylab 库绘制频谱图像

time = np.arange(0, n_frames) * (1.0 / sample_rate)pylab.plot(time, wave_data)pylab.show()

结果如下
pylab 绘制的频谱图片
对于如何区分长(“-”)与短(“.”),我想到的方法是计算出所有信号的平均长度,大于平均长度的即为长(“-”)

# 计算平均频率wave_avg = int(sum([abs(x / 10) for x in wave_data]) / len(wave_data))

在此处有个小插曲,由于音频的波形呈现正弦型,所以在带有信息的区域也会出现频率值为0的情况,最终生成的数据也无法转换为摩斯密码
正弦型的波形
后来在 Python 波形处理_Rone-X的博客-CSDN博客 这篇博客中发现可以取一段区域内的平均值
比较代码如下,使用了 tqdm 库显示绘制进度

# 绘制摩斯图像morse_block_sum = 0  # 待划分的数据morse_block_length = 0  # 待划分的数据长度morse_arr = []time_arr = []pbar = tqdm(wave_data, desc="Drawing Morse Image")for i in pbar:    # 高于平均值记为 1 ,反之为 0    if abs(i) > wave_avg:        morse_block_sum += 1    else:        morse_block_sum += 0    morse_block_length += 1    # 将数据按照指定长度划分    if morse_block_length == 100:        # 计算划分块的平均值        if math.sqrt(morse_block_sum / 100) > 0.5:            morse_arr.append(1)        else:            morse_arr.append(0)        # 横坐标        time_arr.append(len(time_arr))        morse_block_length = 0        morse_block_sum = 0

最后生成的图像如下
最终生成的图像
接着取出 0 位和 1 位的长度信息

# 摩斯电码 按信号长度存储morse_type = []morse_len = []# 摩斯电码长度     0  1morse_obj_sum = [0, 0]morse_obj_len = [0, 0]for i in morse_arr:    if len(morse_type) == 0 or morse_type[len(morse_type) - 1] != i:        morse_obj_len[i] += 1        morse_obj_sum[i] += 1        morse_type.append(i)        morse_len.append(1)    else:        morse_obj_sum[i] += 1        morse_len[len(morse_type) - 1] += 1# 计算信息与空位的平均长度morse_block_avg = morse_obj_sum[1] / morse_obj_len[1]morse_blank_avg = morse_obj_sum[0] / morse_obj_len[0]

与平均长度比较

# 转换为摩斯电码morse_result = ""for i in range(len(morse_type)):    if morse_type[i] == 1:        # 大于平均长度为"-"        if morse_len[i] > morse_block_avg:            morse_result += "-"        # 小于平均长度即为"."        elif morse_len[i] < morse_block_avg:            morse_result += "."    # 大于平均空位长度的为分割    elif morse_type[i] == 0:        if morse_len[i] > morse_blank_avg:            morse_result += "/"

3.解码数据

使用如下字典解码

morse_dict = {    '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F',    '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L',    '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R',    '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X',    '-.--': 'Y', '--..': 'Z',    '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5',    '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-----': '0',    '.-.-.-': '.', '---...': ':', '--..--': ',', '-.-.-.': ';', '..--..': '?',    '-...-': '=', '.----.': '\'', '-..-.': '/', '-.-.--': '!', '-....-': '-',    '..--.-': '_', '.-..-.': '"', '-.--.': '(', '-.--.-': ')', '...-..-': '$',    '.--.-.': '@'}
# 摩斯电码解码morse_array = morse_result.split("/")plain_text = ""for morse in morse_array:    plain_text += morse_dict[morse]

plain_text 变量中即为解码后的数据

验证

运行结果

参考:
利用python自动解析摩斯电码音频文件_如何从音频中提取摩斯密码_Rabbit_Gray的博客-CSDN博客
使用Python绘制语音信号的波形图_python画信号图_进击的小杨人的博客-CSDN博客
Python 波形处理_Rone-X的博客-CSDN博客

来源地址:https://blog.csdn.net/AnKores/article/details/131138260

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用 Python 从音频中提取摩斯密码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python从视频中提取音频的操作方法

这篇文章给大家分享的是有关Python从视频中提取音频的操作方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。简介OpenCV中使用VideoCapture类写的视频是没有音频的,如果要进一步处理音频则需要用到一
2023-06-14

提取视频中的音频 Python只需要三行代码!

身处数据爆炸增长的信息时代,各种各样的数据都飞速增长,视频数据也不例外。我们可以使用 python 来提取视频中的音频,而这仅仅需要安装一个体量很小的 python 库,然后执行三行代码! 语音数据在数据分析领域极为重要。比如可以分析语义、
2022-06-02

使用Python怎么在m3u8文件中提取视频

这期内容当中小编将会给大家带来有关使用Python怎么在m3u8文件中提取视频,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. HLS协议与m3u8文件  HLS,即 H T T P L i v e
2023-06-15

怎么使用Python提取Chrome浏览器保存的密码

小编给大家分享一下怎么使用Python提取Chrome浏览器保存的密码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于Chrome会将大量浏览数据本地保存磁盘中,在本教程中,我们将编写 Python 代码来提取 Wind
2023-06-15

怎么在python中使用DOS获取wifi密码

怎么在python中使用DOS获取wifi密码?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CMD命令获取电脑里配置过的wifi信息按下win+R键,输入CMD
2023-06-14

Python中怎么使用Jieba进行词频统计与关键词提取

这篇文章主要介绍“Python中怎么使用Jieba进行词频统计与关键词提取”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中怎么使用Jieba进行词频统计与关键词提取”文章能帮助大家解决问
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录