问题来源

做CTF的MISC题的时候,遇到一个题,给了一个音频文件,下载下来在耳机中一听,显然是在右声道里边隐藏了一段摩斯电码。

以往都是手动一点一点记录下摩斯电码,然后丢进摩斯电码转换程序里得到加密信息,可是手动记录一不留神就有可能出错,有没有自动化方法呢?

自动化方法

1. 预处理音频

把音频文件的右声道音轨的摩斯电码部分提取出来,保存成一个新的音频文件。

2. 观察摩斯电码音频的实时频谱图


我们将音频数据分成许多小部分(这里以512字节为个一小部分),对于这一小部分的时序数据经过傅里叶变换变为频域数据,就得到了每一小部分所代表的几毫秒时间里该小部分音频的频谱图。

循环执行以上操作,并且将每次操作得到的频域数据绘制成频谱图,绘制到屏幕上,在加一点点延时,就清楚的可以看到整个音频的频谱图动画。
由于摩斯电码只有单纯不变音调的“嘀嘀嘀”声,我们可以观察到整个频谱动画中只有不变的几个频率的频谱条在随着“滴滴”声跳动。我们就可以选定其中一个频率,取其时间序列数据,进行进一步检测划分。

至于为什么不是只有一个频谱条,而是有好几个频谱条(上图中有2个),是因为音频文件中的“滴滴”声不是仅由某个单一频率正弦波构成的,一般还会会有几个泛音频率,这就涉及到声学的知识了,我了解的也不是很深,只要记住,一般频率最低的那个音最稳定,响度最大,这个频率叫做基频。

我们可以选取频率最低或者响度最大的那个频率,下面我们就以选取响度最大的那个频率的数据来处理为例。

3. 选取平均响度最大的那个频率

每次傅里叶变换都获得了这一小段时间内频域能量的一个向量,我们将获得的所有频域能量向量求平均值,得到一个频域平均能量向量,该向量能量最大的那个分量就是我们要找的频率,也就是可以让我们监控“滴滴”声的那个频率,我们只需要将所有频域能量向量中这个频率对应的向量分量的数据都取出来,按时间顺序排好,然后就可以进一步处理了。

4. 数据归一化、二值化

我们先刚刚得到的这个频率上的按照时间顺序排好的能量值序列进行归一化,使其取值都分布在[0, 1]之间,然后再以 0.1 为阈值进行二值化,高于阈值的变为1,低于阈值的变为0。
我们来看一下现在得到的数据。(取前100个数据)

再观察一下我们用音频软件看到的波形图

哈哈~完全一样,说明我们上边的工作是正确的。

5. 转换为摩斯电码

我们先利用“空白”进行分割,“空白"即我们上边归一化处理得到的时间序列中值为0的项,我们要检测,如果接下来一段时间里只出现了很少几个0,那么就是摩斯电码中的短停顿,如果有许多连续的0出现,那就是摩斯电码音频中的长停顿。长停顿是用来划分不同的字符的,每两个长停顿之间的一组点和线(即”短滴“声和”长滴“声)可以由摩斯对照表翻译成一个英文字符或者数字。

我们先根据长空白把我们得到的时间序列划分开,对于每一个划分开的时间子序列,再根据子序列中的”短空白“声把每个子序列”短滴“声和”长滴“声划分开来,对应成点和线输出,长空白对应成斜杠"/"输出,就得到了摩斯电码。

要划分“长空白”、“短空白”以及“长滴”、“短滴”,我们可以以所有空白时长的平均值、所有“滴声”的时长平均值来作为划分阈值,经实验,效果非常好。

6. 摩斯电码解码

让我们把工作做到底,我找来了摩斯电码对照表,将摩斯电码映射成了解密后的字符串,成功的得到了我的CTF题的flag字符串,并且通过了这道题。


自动化工具给我节省了许多时间

本来需要一点一点手动记录的摩斯电码,手动记录完大概需要3分钟左右的时间,自从我用了自己写的自动化工具以后,什么!?写完这个工具已经大半天过去了……
哈哈~不过以后再遇到这种题就方便了许多。

利用python自动解析摩斯电码音频文件相关推荐

  1. python实现的摩斯电码解码\编码器

    代码地址如下: http://www.demodashi.com/demo/14743.html ####详细说明: 现在这年头谍战片.警匪片动不动就用摩斯密码来传递信息,一方面可以用来耍帅,另外一方 ...

  2. 摩斯电码php源码,利用PHP怎么编写一个摩斯电码生成器

    利用PHP怎么编写一个摩斯电码生成器 发布时间:2020-12-15 16:16:54 来源:亿速云 阅读:78 作者:Leah 这篇文章给大家介绍利用PHP怎么编写一个摩斯电码生成器,内容非常详细, ...

  3. 摩斯电码php源码,PHP实现基于文本的摩斯电码生成器

    最近遇到一个基于输入文本生成摩斯代码音频文件的需求.几番搜索无果之后,我决定自己编写一个生成器. 因为我希望通过web的方式访问我的摩斯代码音频文件,所以我决定采用PHP作为我主要的编程语言.上面的截 ...

  4. php解摩斯电码,PHP实现基于文本的莫斯电码生成器

    最近遇到一个基于输入文本生成摩斯代码音频文件的需求.几番搜索无果之后,我决定自己编写一个生成器. 因为我希望通过web的方式访问我的摩斯代码音频文件,所以我决定采用PHP作为我主要的编程语言.上面的截 ...

  5. 用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符

    摩斯电码想必不少伙伴都很熟悉吧,通过简单的长短组合就能把信息编码传递出去,比如声音的长短.灯亮灯的长短等等.虽然现在是信息时代,但摩斯电码这种优雅简介的编码方式依然不过时,甚至在某些关键的场合还能救人 ...

  6. Python 算法训练之摩斯电码

    摩斯电码 摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号.它发明于1837年,发明者有争议,是美国人塞缪尔·莫尔斯或 ...

  7. Morse(摩斯电码)加解密实现(python)

    原理 摩斯电码是一种通信方法,它使用点和划的组合来表示字母.数字和符号.点是短脉冲,划是长脉冲,它们之间需要有一个短暂的间隔,而字符之间需要有一个较长的间隔.通过听觉或视觉方式解码摩斯电码可以识别字符 ...

  8. 彩色?翅膀?摩斯电码?让你拥有独一无二的微信昵称!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 今天来给大家分享一些超级有意思的微信小技巧,可以说学会了 ...

  9. 开源 | 无线电 | 摩斯电码CW发报练习器

    屏幕的右边有目录哦,可以直接点击各章节查看(开源代码在文末) 直接上图 开源协议 与原作相同的GPL 2.0 鸣谢 原作者主页链接:bilibili 原作开源链接:Bilibili 和 github ...

  10. 简单的摩尔斯电码(又译为摩斯电码)

    1.名字解析: 摩尔斯电码(Morse alphabet)(又译为摩斯电码)是一种时通时断的信号代码,这种信号代码通过不同的排列顺序来表达不同的英文字母.数字和标点符号等.由美国人摩尔斯(Samuel ...

最新文章

  1. 【Ubuntu】安装Ubuntu+Win双系统后,每次开机默认是进入Ubuntu,如何设置成默认进入Win?
  2. 8786:方格取数 (多线程dp)
  3. 如何解决没有文件扩展“.js”的脚本引擎
  4. 怎样获取当前页面值php,想要得到当前页面的所有url参数信息怎么用PHP来实现?...
  5. C++中operator的两种用法
  6. “2021-01-30T16:00:00.000Z“: expected format “yyyy-MM-dd HH:mm:ss“时间戳格式化
  7. AngularJS 计时器
  8. 炼数成金hadoop视频干货03
  9. vscode 乱码_如何使用VS Code 编辑Keil项目(51/STM32)
  10. 用java程序写日历_用Java和C#写一个日历
  11. linux的vi详细命令
  12. 生物信息学主要研究方向
  13. Android ActivityManager
  14. 安装office2007 1706错误
  15. 免费证件照换底色微信小程序
  16. defined 用法
  17. 情境领导模式(权变)
  18. C# 母版页页面导航
  19. nmap命令检查在线IP与在线IP的开放端口情况
  20. 科学怪物!3D人体全身运动捕捉系统,港中文联合Facebook出品

热门文章

  1. android 吃鸡模拟器,《刺激战场模拟器》电脑版 逍遥安卓模拟器智能键吃鸡设置...
  2. linux下卸载grads,linux下安装grads
  3. 基于JSP和MYSQL数据库实现的请假管理系统
  4. 【信息学奥赛一本通】题解目录
  5. 华为交换机删除配置命令access_华为交换机基本配置命令详解
  6. geoserver+全能下载器 发布离线地图
  7. php curl jsonrpc,JsonRPC: Lightweight Json-RPC 2.0 client/server in PHP extension
  8. 吐血整理!Python常用第三方库,码住!!!
  9. linux的常用的安装命令
  10. linux安装rz命令