# AES加密原理-详解

http://www.mamicode.com/info-detail-514466.html
0 AES简介
  美国国家标准技术研究所在2001年发布了高级加密标准(AES)。AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准。
  根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128、AES-192和AES-256。本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加。
  1 算法流程

  AES加解密的流程图如下:
  AES加密流程
  AES加密过程涉及到4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

  接下来分别对上述5种操作进行介绍。
  1.1 字节代替

  字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。S盒的详细构造方法可以参考文献[1]。

  下图(a)为S盒,图(b)为S-1(S盒的逆)
  S-box
  Inverse S-box
  S和S-1分别为16x16的矩阵。假设输入字节的值为a=a7a6a5a4a3a2a1a0,则输出值为S[a7a6a5a4][a3a2a1a0],S-1的变换也同理。

  例如:字节00替换后的值为(S[0][0]=)63,再通过S-1即可得到替换前的值,(S-1 [6][3]=)00。
  1.2 行移位

  行移位的功能是实现一个4x4矩阵内部字节之间的置换。

1.2.1 正向行移位

  正向行移位的原理图如下:
  这里写图片描述
  实际移位的操作即是:第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。假设矩阵的名字为state,用公式表示如下:state’[i][j] = state[i][(j+i)%4];其中i、j属于[0,3]

1.2.2 逆向行移位

  逆向行移位即是相反的操作,用公式表示如下:state’[i][j] = state[i][(4+j-i)%4];其中i、j属于[0,3]

1.3 列混淆

  列混淆:利用GF(28)域上算术特性的一个代替。

1.3.1 正向列混淆

  正向列混淆的原理图如下:
  这里写图片描述
  根据矩阵的乘法可知,在列混淆的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法都是定义在GF(28)上的,需要注意如下几点:

    1) 将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011;[1]

    2) 乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)

    3) 此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(相当于是异或运算)。

  假设某一列的值如下图,运算过程如下:
  这里写图片描述
  这里写图片描述
  同理可以求出另外几个值。

1.3.2 逆向列混淆

  逆向列混淆的原理图如下:
  这里写图片描述
  由于:
  这里写图片描述
    说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。

1.4 轮密码加

  任何数和自身的异或结果为0。加密过程中,每轮的输入与轮密钥异或一次;因此,解密时再异或上该轮的密钥即可恢复输入。

1.5 密钥扩展

  密钥扩展的原理图如下:
  这里写图片描述
  密钥扩展过程说明:

    1) 将初始密钥以列为主,转化为4个32 bits的字,分别记为w[0…3];

    2) 按照如下方式,依次求解w[j],其中j是整数并且属于[4,43];

    3) 若j%4=0,则w[j]=w[j-4]⊕g(w[j-1]),否则w[j]=w[j-4]⊕w[j-1];

  函数g的流程说明:

    4) 将w循环左移一个字节;

    5) 分别对每个字节按S盒进行映射;

    6) 与32 bits的常量(RC[j/4],0,0,0)进行异或,RC是一个一维数组,其值如下。(RC的值只需要有10个,而此处用了11个,实际上RC[0]在运算中没有用到,增加RC[0]是为了便于程序中用数组表示。由于j的最小取值是4,j/4的最小取值则是1,因此不会产生错误。)

      RC = {00, 01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}

2 源码

  在GitHub上找到的AES实现代码,感觉写得不错。

  https://github.com/dhuertas/AES/blob/master/aes.c

3 参考文献

[1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2011.1.

<think>我们正在分析一个M3U8文件的内容,该文件是HLS(HTTP Live Streaming)协议使用的播放列表文件。用户提供了一个包含特定标签的M3U8文件示例,我们需要解析这些标签的含义和作用。 根据用户提供的标签: - `#EXTM3U`:M3U8文件头,必须放在第一- `#EXT-X-VERSION:3`:表示M3U8文件的版本号为3。 - `#EXT-X-ALLOW-CACHE:YES`:表示允许客户端缓存分片(TS文件)。 - `#EXT-X-PLAYLIST-TYPE:VOD`:表示播放列表类型为点播(Video On Demand),即整个文件是完整的,不会动态更新。 - `#EXT-X-KEY:METHOD=AES-128,URI="encryption.key"`:表示分片使用AES-128加密,密钥文件的位置是`encryption.key`。 - `#EXT-X-VERSION:3`:重复了一次,但只需要一次即可,可能是用户输入重复。 - `#EXT-X-MEDIA-SEQUENCE:1`:表示第一个分片的序列号从1开始。 另外,用户还提到了`#EXT-X-TARGETDURATION:10`,每个分片的最大时长是10秒。 注意:用户提供的引用[2]和[3]中包含了M3U8标签的解释,我们可以参考。 现在,我们分析这个M3U8文件的结构和含义: 1. **文件头与版本**: - `#EXTM3U` 和 `#EXT-X-VERSION:3` 表明这是一个版本3的M3U8文件。 2. **缓存控制**: - `#EXT-X-ALLOW-CACHE:YES` 表示客户端可以缓存TS分片,这样可以减少重复下载。 3. **播放列表类型**: - `#EXT-X-PLAYLIST-TYPE:VOD` 表示这是一个点播流,即整个视频是预先准备好的,不会再有新的分片加入。因此,播放列表会以`#EXT-X-ENDLIST`标签结束(但用户没有提供这个标签,不过因为是VOD类型,所以应该会包含,或者后续会看到)。 4. **加密信息**: - `#EXT-X-KEY:METHOD=AES-128,URI="encryption.key"` 表示每个分片都使用AES-128加密加密密钥需要从`encryption.key`这个URI获取。注意,这个密钥文件通常是一个16字节(128位)的二进制文件。在播放时,客户端会先下载这个密钥文件,然后用它来解密每个TS分片。 5. **分片序列**: - `#EXT-X-MEDIA-SEQUENCE:1` 表示第一个分片的序号是1,后续分片序号依次递增(2,3,...)。每个分片前面都有一个`#EXTINF`标签,指定分片的时长和可选描述。 6. **分片时长**: - `#EXT-X-TARGETDURATION:10` 指定了每个分片的最大时长(这里是10秒),所有分片的实际时长都不能超过这个值。 一个典型的M3U8文件(点播)的结构如下: ``` #EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-KEY:METHOD=AES-128,URI="encryption.key" #EXTINF:9.5, segment1.ts #EXTINF:9.8, segment2.ts #EXTINF:10.0, segment3.ts #EXT-X-ENDLIST ``` 注意: - 每个分片前面都有`#EXTINF`标签,标明该分片的持续时间(单位秒)和可选的描述(可以省略)。 - 最后一个分片之后会有`#EXT-X-ENDLIST`标签,表示播放列表结束(因为是VOD类型)。 关于加密- 每个分片(TS文件)都是使用相同的密钥加密的吗?通常,如果只有一个`#EXT-X-KEY`标签,那么所有的分片都使用同一个密钥解密。但HLS也支持密钥轮换,即通过多个`#EXT-X-KEY`标签指定不同分片使用不同的密钥。 在用户提供的标签中没有看到分片列表,但根据M3U8格式,在`#EXT-X-MEDIA-SEQUENCE`和`#EXT-X-KEY`之后,应该跟着一系列分片信息(每个分片前有一个`#EXTINF`标签)。 因此,对于这个M3U8文件,播放流程如下: 1. 客户端读取M3U8文件,解析出加密密钥URI(`encryption.key`),然后下载该密钥。 2. 客户端按顺序下载分片(如`segment1.ts`、`segment2.ts`等),并使用下载的密钥对每个分片进AES-128解密(通常是CBC模式,初始向量IV可能是分片的序列号或由`EXT-X-KEY`标签的`IV`属性指定,如果没有指定,则默认使用分片的序列号作为IV)。 3. 解密后的分片是普通的TS文件,可以被播放器播放。 注意:如果`#EXT-X-KEY`标签没有指定`IV`,那么IV将由分片的媒体序列号(即`EXT-X-MEDIA-SEQUENCE`的值加上该分片在播放列表中的索引偏移)构成,并转换为16字节的二进制数(大端序)。 总结:这个M3U8文件描述了一个点播视频流,视频分片使用AES-128加密,密钥从`encryption.key`获取,客户端需要先获取密钥才能解密播放。 相关问题: 1. 如何获取并解密HLS中的AES-128加密的分片? 2. M3U8文件中的`#EXT-X-KEY`标签的`IV`参数有什么作用? 3. 点播(VOD)和直播(LIVE)的M3U8文件有何区别? 4. 如何手动下载并解密一个加密的HLS流? 5. 为什么M3U8文件中有时会有多个`#EXT-X-KEY`标签? </think>### M3U8文件深度解析(含AES-128加密配置) #### 1. **基础结构分析** 根据提供的标签,该M3U8文件符合HLS协议标准(HTTP Live Streaming),结构如下: ```m3u8 #EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-KEY:METHOD=AES-128,URI="encryption.key" ``` - **核心标签功能**: - `#EXT-X-VERSION:3`:HLS协议版本3(支持分片加密等高级特性)[^2] - `#EXT-X-TARGETDURATION:10`:每个TS分片最大时长为10秒 - `#EXT-X-ALLOW-CACHE:YES`:允许客户端缓存分片 - `#EXT-X-PLAYLIST-TYPE:VOD`:点播类型(非直播流) - `#EXT-X-MEDIA-SEQUENCE:1`:首个TS分片序列号为1 - `#EXT-X-KEY`:AES-128加密配置(密钥URI为`encryption.key`) #### 2. **AES-128加密机制详解** `#EXT-X-KEY:METHOD=AES-128,URI="encryption.key"` 表明: 1. **密钥获取**:需从URI `encryption.key` 下载16字节密钥(128位) 2. **解密流程**: $$ \text{解密过程} = D_{\text{AES-128}}(K_{\text{URI}}, \text{IV}, C) $$ 其中 $C$=密文分片,$K_{\text{URI}}$=URI获取的密钥,$IV$=初始化向量(默认由分片序列号生成) 3. **安全要求**:密钥传输需HTTPS,否则易被中间人截获[^2] #### 3. **点播(VOD)特性影响** `#EXT-X-PLAYLIST-TYPE:VOD` 表示: - 完整文件已生成(非实时直播流) - 文件结尾必须有 `#EXT-X-ENDLIST` 标识(完整播放列表) - 允许随机访问和回放(缓存生效) #### 4. **分片序列逻辑** `#EXT-X-MEDIA-SEQUENCE:1` 结合目标时长: - 分片命名规则:`{basename}-{n}.ts`(例如 `video-1.ts`, `video-2.ts`) - 总时长估算:若最后分片序号为 $N$,则总时长 $\approx 10N$ 秒 - 缓存有效性:客户端可复用已下载分片(减少重复请求) #### 5. **安全风险提示** 1. **密钥暴露风险**: - `encryption.key` 若通过HTTP传输可被劫持 - 建议:使用带认证的HTTPS URI(如 `https://domain.com/key?token=xxx`) 2. **IV安全缺陷**: - 未显式指定IV时默认使用分片序列号,可能导致相同密钥的密文模式重复 - 解决方案:显式添加IV参数(如 `IV=0x...`)[^2] > **完整示例**: > ```m3u8 > #EXTINF:9.5, // 分片1时长9.5秒(<10s) > video-1.ts // 需用encryption.key解密 > #EXTINF:10.0, // 分片2时长10秒 > video-2.ts > #EXT-X-ENDLIST // VOD必备结束符 > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值