使用openssl m3u8解密 EXT-X-KEY:METHOD=AES-128,URI=xxx

1.ts

ts是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。ts即"Transport Stream"的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。
大多数在线播放的视频使用ts格式作流媒体传输

2.m3u8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

通常m3u8包含了若干个ts文件的名称,按播放顺序有序排列,还包括版本、是否加密等信息

下面对AES-128的ts文件解密
.m3u8文件
在这里插入图片描述

F12查看key
在这里插入图片描述

步骤
在这里插入图片描述
openssl aes-128-cbc自动化脚本

#16进制数转ascii码,这个预先生成,最后的0a不要
#hexdump -v -e '16/1 "%02x"' key.key 
#0a4d96498feee8ae
strkey=30613464393634393866656565386165

#一共有120个小文件
for j in $(seq 0 119)
do
  #echo $j
  iv=$(printf '%032x' $j)
  #echo $iv

  input="./ts/"$j".mp4"
  output="./output/"$j"_out.mp4"
  #echo $input
  #echo $output
  openssl aes-128-cbc -d -in $input -out $output -nosalt -iv $iv -K $strkey
done

#openssl aes-128-cbc -d -in 0.mp4 -out 0_out.mp4 -nosalt -iv $iv -K $strkey
[root@localhost ~]# ./aes_run.sh 
[root@localhost ~]# ls ./output/
0_out.mp4    110_out.mp4  13_out.mp4  24_out.mp4  35_out.mp4  46_out.mp4  57_out.mp4  68_out.mp4  79_out.mp4  8_out.mp4
100_out.mp4  111_out.mp4  14_out.mp4  25_out.mp4  36_out.mp4  47_out.mp4  58_out.mp4  69_out.mp4  7_out.mp4   90_out.mp4
101_out.mp4  112_out.mp4  15_out.mp4  26_out.mp4  37_out.mp4  48_out.mp4  59_out.mp4  6_out.mp4   80_out.mp4  91_out.mp4
102_out.mp4  113_out.mp4  16_out.mp4  27_out.mp4  38_out.mp4  49_out.mp4  5_out.mp4   70_out.mp4  81_out.mp4  92_out.mp4
103_out.mp4  114_out.mp4  17_out.mp4  28_out.mp4  39_out.mp4  4_out.mp4   60_out.mp4  71_out.mp4  82_out.mp4  93_out.mp4
104_out.mp4  115_out.mp4  18_out.mp4  29_out.mp4  3_out.mp4   50_out.mp4  61_out.mp4  72_out.mp4  83_out.mp4  94_out.mp4
105_out.mp4  116_out.mp4  19_out.mp4  2_out.mp4   40_out.mp4  51_out.mp4  62_out.mp4  73_out.mp4  84_out.mp4  95_out.mp4
106_out.mp4  117_out.mp4  1_out.mp4   30_out.mp4  41_out.mp4  52_out.mp4  63_out.mp4  74_out.mp4  85_out.mp4  96_out.mp4
107_out.mp4  118_out.mp4  20_out.mp4  31_out.mp4  42_out.mp4  53_out.mp4  64_out.mp4  75_out.mp4  86_out.mp4  97_out.mp4
108_out.mp4  119_out.mp4  21_out.mp4  32_out.mp4  43_out.mp4  54_out.mp4  65_out.mp4  76_out.mp4  87_out.mp4  98_out.mp4
109_out.mp4  11_out.mp4   22_out.mp4  33_out.mp4  44_out.mp4  55_out.mp4  66_out.mp4  77_out.mp4  88_out.mp4  99_out.mp4
10_out.mp4   12_out.mp4  

openssl aes-128加密方式
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。
例如

openssl aes-128-cbc -d -in 8JgoCJ8p/20.ts -out 8JgoCJ8p/out_20.ts -K 62313737353431616663646439616161 -iv 00000000000000000000000000000000
openssl aes-128-ecb -d -in 8JgoCJ8p/20.ts -out 8JgoCJ8p/out_20.ts -K 62313737353431616663646439616161

合并ts文件,使用ffmpeg清晰的更高

ffmpeg.exe -f concat -safe 0 -i ./filelist.txt -c copy ./test.mp4

filelist.txt:

file '0.ts'
file '1.ts'
file '2.ts'
file '3.ts'
file '4.ts'
file '5.ts'
file '6.ts'
file '7.ts'
file '8.ts'
file '9.ts'
file '10.ts'
file '11.ts'
file '12.ts'

参考
https://blog.csdn.net/newnewfeng/article/details/52275650

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
TR34ObjectIdentifers DEFINITIONS EXPLICIT TAGS ::= BEGIN -- Content types, from PKCS #7 -- pkcs7 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs7(7) } id-data OBJECT IDENTIFIER ::= { pkcs7 data(1) } id-signedData OBJECT IDENTIFIER ::= { pkcs7 signedData(2) } id-envelopedData OBJECT IDENTIFIER ::= { pkcs7 envelopedData (3) } id-digestedData OBJECT IDENTIFIER ::= { pkcs7 digestedData(5) } id-encryptedData OBJECT IDENTIFIER ::= { pkcs7 encryptedData (6) } pkcs9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) } smime OBJECT IDENTIFIER ::= { pkcs9 smime(16) } -- Signed attributes, from PKCS #9, S/MIME, and ANS X9.73 -- id-contentType OBJECT IDENTIFIER ::= { pkcs9 contentType(3) } id-messageDigest OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) 4 } id-signingTime OBJECT IDENTIFIER ::= { pkcs9 signingTime(5) } id-contentIdentifier OBJECT IDENTIFIER ::= { smime id-aa(2) contentIdentifier(7) } id-msgSequenceNo OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x973(10060) attribute(1) msgSequenceNo(1) } id-signingCertificate OBJECT IDENTIFIER ::= { smime id-aa(2) signingCertificate(12) } id-otherSigningCert OBJECT IDENTIFIER ::= { itu-t(0) identified-organization(4) etsi(0) electronic-signature-standard(1733) part1(1) attributes(1) 12 } id-biometricSyntax OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x973(10060) attribute(1) biometricSyntax(2) } END 请理解这段代码,并使用openssl的接口,采用linux c编程完成对数据的编码和解码
06-02
这段代码是定义了一些常用的对象标识符(Object Identifiers, OID),用于标识不同的加密算法、数字证书、数字签名、数字信封等信息。其中,pkcs7、pkcs9、smime是定义在PKCS #7和PKCS #9标准中的OID,其他的OID则是定义在不同的标准中,如X9.73、ETSI等。 要使用openssl的接口进行数据编码和解码,可以使用以下函数: 1. 数据编码: ``` int i2d_X509(X509 *x, unsigned char **out); ``` 将X509证书结构体编码成DER格式的二进制数据。其中,X509结构体定义在openssl/x509.h头文件中。 2. 数据解码: ``` X509 *d2i_X509(X509 **x, const unsigned char **in, long len); ``` 将DER格式的二进制数据解码成X509证书结构体。其中,in为指向待解码数据的指针,len为数据长度。 具体实现过程可以参考以下代码: ```c #include <openssl/x509.h> #include <openssl/err.h> int main() { // 加载证书文件 FILE *fp = fopen("cert.pem", "rb"); if (!fp) { printf("failed to open file\n"); return -1; } X509 *x = PEM_read_X509(fp, NULL, NULL, NULL); if (!x) { printf("failed to read certificate\n"); fclose(fp); return -1; } fclose(fp); // 编码证书数据 unsigned char *buf = NULL; int len = i2d_X509(x, &buf); if (len < 0) { printf("failed to encode certificate\n"); X509_free(x); return -1; } // 解码证书数据 const unsigned char *p = buf; X509 *x2 = d2i_X509(NULL, &p, len); if (!x2) { printf("failed to decode certificate\n"); X509_free(x); free(buf); return -1; } // 比较两个证书是否一致 int cmp = X509_cmp(x, x2); if (cmp == 0) { printf("the two certificates are identical\n"); } else { printf("the two certificates are different\n"); } X509_free(x); X509_free(x2); free(buf); ERR_free_strings(); return 0; } ``` 其中,PEM_read_X509函数用于从文件中读取PEM格式的证书数据,并将其转换成X509结构体;X509_cmp函数用于比较两个证书是否一致。在编译时需要添加-lcrypto参数来链接openssl库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值