WebRTC音视频协议-SRTP

1、SRTP环境搭建


1.1 SRTP简介

STRP它是 思科的开源安全 RTP 库。RTP 是实时传输协议,一种用于传输实时数据(如电话、音频和视频)的 IETF 标准,由RFC 3550定义。SRTP用于为 RTP 数据提供机密性以及对 RTP 标头和有效负载进行身份验证。SRTP 是 IETF 标准,在RFC 3711中定义,该库支持 SRTP 的所有强制功能。

1.2 环境搭建

1.2.1安装openssl加密库

git clone https://github.com/openssl/openssl/archive/refs/tags/openssl-3.0.1.tar.gz

cd openssl-3.0.1

./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl

make -j4 && make install

1.2.2安装libsrtp库

git clone git clone https://github.com/cisco/libsrtp.git

cd libsrtp

./configure --prefix=/opt/srtp \

--with-openssl-dir=/opt/openssl \

--enable-openssl \

crypto_CFLAGS=/opt/openssl/include \

crypto_LIBS=/opt/openssl/lib64

2、协议格式介绍


V 2bits 版本号,版本2

P 1bit 填充位,当负载的长度不够32bits的整数倍时,需要填充位

X 1bit 扩展位,若为1,则固定的包头后增加一个32bits的扩展(rtp extension)

CC 4bits CSRC的数目

M 1bit 允许在比特流中标记重要的事件

PT 7bits 负载类型

seq16bits 每发送一个RTP数据包,序列号加1,根据此来判断序列号的顺序

时间戳 32bits

SSRC标识符 32bits synchronizating source identifier 识别同步源

CSRC标识符 n个32bits contributing source identifiers 识别负载重的有效贡献源

可选存在的RTP extension

加密的数据(末尾可能包含RTP padding和RTP pad count)

包尾是SRTP MKI(可选),master key identifier,是用来生成session加密密钥的随机位串标识符。

认证标签(Authentication tag)

3、实现流程


3.1 SRTP协商

SRTP加密之前双方需要进行加密算法和秘钥的协商,可以采用sip的协商方式进行协商。主要是在sip中增加:a=crypto字段用于存放加密类型和秘钥。那么问题来了秘钥这里是否需要进行加密,答案很显然需要进行秘钥的加密,不然就透明了你的秘钥第三方也可以获取秘钥进行解密操作

3.2 SRTP数据传输

srtp协商已经获取了双方的秘钥这时候可以利用秘钥进行加密操作,对方也可以利用秘钥对加密数据进行还原。

4 协议三方库使用


4.1 加密过程

srtp_t session;

srtp_policy_t policy;

// Set key to predetermined value

uint8_t key[30] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,

0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,

0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,

0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D};

// initialize libSRTP

srtp_init();

// default policy values

memset(&policy, 0x0, sizeof(srtp_policy_t));

// set policy to describe a policy for an SRTP stream

srtp_crypto_policy_set_rtp_default(&policy.rtp);

srtp_crypto_policy_set_rtcp_default(&policy.rtcp);

policy.ssrc = ssrc;

policy.key = key;

policy.next = NULL;

// allocate and initialize the SRTP session

srtp_create(&session, &policy);

// main loop: get rtp packets, send srtp packets

while (1) {

char rtp_buffer[2048];

unsigned len;

len = get_rtp_packet(rtp_buffer);

srtp_protect(session, rtp_buffer, &len);

send_srtp_packet(rtp_buffer, len);

}

4.2 解密过程

srtp_t session;

srtp_policy_t policy;

// Set key to predetermined value

uint8_t key[30] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,

0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,

0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,

0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D};

// initialize libSRTP

srtp_init();

// default policy values

memset(&policy, 0x0, sizeof(srtp_policy_t));

// set policy to describe a policy for an SRTP stream

srtp_crypto_policy_set_rtp_default(&policy.rtp);

srtp_crypto_policy_set_rtcp_default(&policy.rtcp);

policy.ssrc = ssrc;

policy.key = key;

policy.next = NULL;

// allocate and initialize the SRTP session

srtp_create(&session, &policy);

// main loop: get rtp packets, send srtp packets

while (1) {

char rtp_buffer[2048];

unsigned len;

recv_srtp_packet(rtp_buffer, &len);

srtp_unprotect(session, rtp_buffer, &len);

//deal data

deal_data(rtp_buffer, len);

}

原文链接:音视频协议-SRTP - 资料 - 我爱音视频网 - 构建全国最权威的音视频技术交流分享论坛

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值