JAVA版网易云音乐格式转换器

这篇具有很好参考价值的文章主要介绍了JAVA版网易云音乐格式转换器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

网易云音乐下载的歌曲格式多为ncm,这种格式除了用网易云音乐App其他播放器无法播放。于是想寻求其格式转换的工具,搜索了下确实有相关工具,不过很多山寨工具需要收费。然后又试图寻求其他方式,经过一番调研发现这玩意其实早已经被人扒光了到处裸奔(我估摸着这个事情就是千防万防,家贼难防。因为基于目前ncm文件的加密方式,要根据其加密字节流去反推加密过程好像有点难,不知道搞破解的同学怎么看这个事情)。例如:《网易云VIP音乐NCM文件转MP3,C语言版本》https://blog.csdn.net/y123456wydhckd/article/details/128368486;于是索性自己动手搞个JAVA版的,然后顺带加上个重命名的功能。网易云音乐文件命名规则是:歌手名开头,这样下载后默认的排序就是按照歌手名,一直连着听某一个咖咖的歌谁都会觉得无趣(我一般都是开车的时候用U盘听歌),重命名的做法是:增加一个按文件名进行murmur哈希的前缀值,从而起到一个哈希散开的效果。

1. 网易云音乐文件加密概要

1.1 加密文件元数据定义

首先看下网易云音乐ncm文件元数据定义,其实通过NcmMetaData的定义及注释,大家就应该能大致知道如何去解密网易云音乐ncm文件了。

/**
 * NcmMetaData
 *
 * @author chenx
 */
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NcmMetaData {

    /**
     * 头信息:10 bytes
     * 数据结构不明(忽略)
     */
    private byte[] magicHeader;

    /**
     * RC4密钥长度:4 bytes(字节小端排序)
     */
    private int rc4KeyLength;

    /**
     * RC4密钥:var bytes
     * 1. 按字节对0x64异或。
     * 2. AES解密,去除填充部分。
     * 3. rc4Key硬编码干扰盐字符串(17字节):neteasecloudmusic
     * 4. RC4密钥: 剩余字节
     */
    private Rc4Key rc4Key;

    /**
     * 音乐信息长度:4 bytes(字节小端排序)
     */
    private int musicInfoLength;

    /**
     * 音乐信息:var bytes
     * 1. 按字节对0x63异或。
     * 2. 硬编码干扰盐字符串(22字节):163 key(Don't modify):
     * 3. Base64进行解码。
     * 4. AES解密。
     * 5. 硬编码Json前缀干扰字符串(6字节):music:
     * 6. Music对象Json字符串
     */
    private CloudMusic cloudMusic;

    /**
     * CRC: 4 bytes
     */
    private byte[] crc;

    /**
     * Gap: 5 bytes
     */
    private byte[] gap;

    /**
     * 专辑图片大小:4 bytes(字节小端排序)
     */
    private int albumImageSize;

    /**
     * 专辑图片:var bytes
     */
    private byte[] albumImage;

    /**
     * 音频数据
     */
    private byte[] audioData;
}

1.2 加密概要及总结

  • 加密概要
  1. 自定义了一个紧凑的数据结构,例如:10字节头、4字节密钥长度等;
  2. 自定义数据结构中的关键信息又进行自定义加密及编码,例如:音频数据加密密钥、音乐信息等;
  3. 自定义数据结构中加入了一些无用硬编码干扰盐字符串,例如:neteasecloudmusic、163 key(Don’t modify):等;
  4. NCM格式的加密文件中除了音频数据外还包含音乐附属信息,例如:专辑,歌手,歌名,图片等;
  5. 音频数据的加密密钥位于加密文件的自身之中,加密算法为性能相对AES较好的非标RC4加密算法;
  • 加密总结
    从以上几点可以看出其实网易云音乐NCM文件的加密其实基于都是一些经典老套路:
  • 通过自定义数据结构的方式将密钥置于加密文件自身之中,同时加入一些无关的盐做为干扰(网易云音乐有点low,都是一些硬编码的玩意);
  • 出于加解密效率考虑,选择了以异或运算为主的替换类加密算法(可以把异或运算理解为不进位的二进制加法,效率自然超高,对相同的东西进行二次异或即可得到原始值,因此基于异或的解密只需再来一次即可);
  • 对于密钥的管理则选择安全性较高的高级加密算法(网易云音乐选择的AES,一般来说对于密钥的管理推荐使用非对称的RSA或者ECC及其变种);

2. RC4加密算法

2.1 RC加密算法4简介

RC4 加密算法的核心思想是通过在初始状态下生成一个伪随机的字节流,然后将明文与这个字节流进行异或运算,从而得到密文。具体来说,RC4 算法包括两个主要步骤:
1. 密钥调度算法(Key Scheduling Algorithm,KSA):

  • 使用初始状态的 S-box(置换盒:Substitution Box)。
  • S-box 是一个包含 0 到 255 的数字的数组,初始状态下是有序的。
  • 根据给定的密钥,通过对 S-box 的多次置换和交换来打乱其顺序,生成一个混乱的 S-box。

2. 伪随机数生成算法(Pseudo-Random Generation Algorithm,PRGA):

  • 使用经过打乱的 S-box。
  • 利用 S-box 生成一个伪随机的字节流,这个字节流被用作密钥流。
  • 将明文与密钥流进行异或运算,得到密文。

2.2 RC加密算法4实现

在 Java 中,RC4 算法的实现通常并不包含在标准的 Java 加密库中,一个常用的 Java 加密库是 Bouncy Castle,Bouncy Castle 提供了丰富的密码学算法支持,包括 RC4。如果要使用Bouncy Castle进行标准RC4加解密,java11可以添加依赖(bouncycastle jdk版本太多了):

<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcprov-jdk15to18</artifactId>
	<version>1.76</version>
</dependency>

需要补充说明的是:网易云音乐对于音频数据加密的RC4是一个非标的RC4,标准RC4中S-box(置换盒)是一个字节的数组,因此这里只能自己实现:

package cn.bossfriday.cloudmusic.converter.cipher;

/**
 * RC4
 * <p>
 * RC4 加密算法的核心思想是通过在初始状态下生成一个伪随机的字节流,然后将明文与这个字节流进行异或运算,从而得到密文。
 * 具体来说,RC4 算法包括两个主要步骤:
 * 1. 密钥调度算法(Key Scheduling Algorithm,KSA):
 * * 使用初始状态的 S-box(置换盒: Substitution Box)。
 * * S-box 是一个包含 0 到 255 的数字的数组,初始状态下是有序的。
 * * 根据给定的密钥,通过对 S-box 的多次置换和交换来打乱其顺序,生成一个混乱的 S-box。
 * <p>
 * 2. 伪随机数生成算法(Pseudo-Random Generation Algorithm,PRGA):
 * * 使用经过打乱的 S-box。
 * * 利用 S-box 生成一个伪随机的字节流,这个字节流被用作密钥流。
 * * 将明文与密钥流进行异或运算,得到密文。
 *
 * @author chenx
 */
public class RC4 {

    private final int[] sBox = new int[256];

    /**
     * RC4密钥调度(RC4-KSA:Key Scheduling Algorithm)
     *
     * @param key
     */
    public void keySchedule(byte[] key) {
        int len = key.length;
        for (int i = 0; i < 256; i++) {
            this.sBox[i] = i;
        }

        int j = 0;
        for (int i = 0; i < 256; i++) {
            j = (j + this.sBox[i] + key[i % len]) & 0xff;
            int swap = this.sBox[i];

            this.sBox[i] = this.sBox[j];
            this.sBox[j] = swap;
        }
    }

    /**
     * RC4伪随机数生成(RC4-PRGA:Pseudo-Random Generation Algorithm)
     *
     * @param data
     * @param length
     */
    public void randomGenerate(byte[] data, int length) {
        int i = 0;
        int j = 0;
        for (int k = 0; k < length; k++) {
            i = (k + 1) & 0xff;
            j = (this.sBox[i] + i) & 0xff;

            data[k] ^= this.sBox[(this.sBox[i] + this.sBox[j]) & 0xff];
        }
    }
}

3. 源码及运行

3.1 源码

https://github.com/bossfriday/bossfriday-cloudmusic-converter

3.2 运行

为了方便大家本地调试,在项目中的ncm目录中已经放了3个ncm歌曲,大家可以按照以下方式进行本地调试:文章来源地址https://www.toymoban.com/news/detail-832368.html

  1. 运行:Bootstrap的main方法;
  2. 输入:1;
  3. 输入:ncm文件源文件夹路径、转换后文件夹路径;
    网易云音乐格式转换工具 github,其他,java,开发语言

到了这里,关于JAVA版网易云音乐格式转换器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 免费视频格式转换软件,6大免费视频转换器推荐

    免费视频格式转换软件,6大免费视频转换器推荐

    看到大多数人拥有电脑、智能电视,尤其是移动设备,这一代人并不奇怪。在线观看电影和视频是最常见的消磨时间的娱乐方式之一。能够通过网络观看视频是件好事。有些人还喜欢下载它以供离线观看,因为您并非一直都在使用 Wi-Fi。有时,某些格式不适合其他设备,并且

    2024年02月03日
    浏览(43)
  • 【Python小项目之Tkinter应用】【实用工具】.MP4格式文件转换.GIF文件转换器大优化,实现多视频上传功能,多个视频同时转换为GIF,并为每个视频进度分配进度条等相关信息
  • 如何利用音频转换器将多个MP3音频转换为OGG格式

    如何利用音频转换器将多个MP3音频转换为OGG格式

    现在,我们接触到的很多音频文件一般都是MP3格式的。但是我们偶尔也需要用到ogg格式的音频文件,所以就需要我们将MP3格式音频文件转换为ogg格式了,那么,如果想要将MP3格式文件转换为OGG格式该如何操作呢?相信很多朋友心里都没有答案,小编找到了一种有效的方法,接

    2024年03月11日
    浏览(44)
  • 免费的音频转换器带你突破音频格式束缚

    免费的音频转换器带你突破音频格式束缚

    曾经有一个名叫吴欢的音乐爱好者,他热爱收集各种音频文件,从经典的老歌到新潮的流行曲,样样都不放过。然而,他遇到了一个令人头疼的问题:因为音频格式的不同,他无法将一些珍贵的音乐记录转化为文字形式。他渴望能够快速、方便地将这些美妙的旋律转换成文字

    2024年02月15日
    浏览(44)
  • 使用Spring MVC的消息转换器设置日期格式

    在后端返回给前端的JSON数据中含有日期类型的字段时,如何指定该类型的日期的显示格式。 使用Spring MVC的消息转换器即可。 添加配置类,并继承 WebMvcConfigurationSupport 类,重写 extendMessageConverters 自定义对象转换器 JacksonObjectMapper ,设置对应日期类型的转换格式 随后问题将会

    2024年02月16日
    浏览(42)
  • m4a音频格式转换器:让音频轻松换装

    m4a音频格式转换器:让音频轻松换装

    大家有没有遇到这样的情况——你下载了一个很酷的音频文件,但是播放设备却说“不认识”这个格式?别担心!现在有个超级厉害的工具可以帮你解决这个问题,它就是m4a音频格式转换器!它能让你的音频文件变身,适应不同设备和播放软件的需求。 那么,这个m4a音频格式

    2024年02月12日
    浏览(10)
  • 怎么在电脑上把jpg改成png?批量图片格式转换器分享推荐

    怎么在电脑上把jpg改成png?批量图片格式转换器分享推荐

    美工在处理图片时,经常使用png格式图片,所以就会有用到格式转换器(https://www.yasuotu.com/geshi),尤其是在需要处理批量图片的时候,今天介绍的这款批量图片格式转换器,可以在线操作,打开浏览器就能完成png格式转换,非常方便,一起来看一下吧。 使用浏览器搜索【压

    2023年04月24日
    浏览(49)
  • 【SpringBoot笔记35】SpringBoot自定义Converter转换器和Formatter格式化器

    这篇文章,主要介绍SpringBoot如何自定义Converter转换器和Formatter格式化器。 目录 一、数据转换器Converter 1.1、自定义Converter转换器 1.2、配置自定义的Converter

    2024年02月15日
    浏览(11)
  • 如何使用Word转PDF转换器在线工具?在线Word转PDF使用方法

    如何使用Word转PDF转换器在线工具?在线Word转PDF使用方法

    Word转PDF转换器在线,是一种方便快捷的工具,可帮助您在不需要下载任何软件的情况下完成此任务。无论您是需要在工作中共享文档,还是将文件以PDF格式保存以确保格式不变,都可以依靠这款在线工具轻松完成转换。那么如何使用Word转PDF转换器在线工具呢? 如何使用Word转

    2024年02月14日
    浏览(12)
  • 【图像增强器和转换器】Winxvideo AIAI 驱动的视频/图像增强器和转换器软件。

    【图像增强器和转换器】Winxvideo AIAI 驱动的视频/图像增强器和转换器软件。

    Winxvideo AI,以前称为WinX HD Video Converter Deluxe,是一款利用尖端深度学习技术的高级软件工具包。它提供了一套全面的工具,用于放大、稳定、转换、压缩、录制和编辑 4K/8K/HDR 视频。 AI 驱动的功能通过全面的 GPU 加速确保影院级质量。 Winxvideo AI 提供了一套强大且易于使用的视

    2024年02月20日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包