音视频协议-SRTP

article/2025/10/13 14:05:42

1 SRTP环境搭建

1.1 SRTP简介

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

1.2 环境搭建

安装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

安装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 datadeal_data(rtp_buffer, len);
}

http://chatgpt.dhexx.cn/article/f5pQlLxr.shtml

相关文章

关系型数据库设计

目录 一、本章目标 二、为什么需要设计数据库 三、设计数据库的步骤 四、数据库设计E-R图 4.1为什么使用E-R图 4.2绘制E-R图 4.3实体间的映射关系 五、数据库设计模型转换 5.1关系型数据库设计分类 5.2各模型之间的元素对应关系 5.3基本转换原理 5.4将实体关系转化为表…

个人博客数据库设计

前言 最近要做数据库大作业,在思考了很久之后,还是设计一个简单的个人博客数据库,数据库采用的时MySQL5.7。 数据库下载(提取码: s2f9) 一、 概述及分析 1.1 项目背景 随着互联网的发展,越来越多的人拥…

[数据库设计]如何合理和有效的进行数据库设计

#前言 通常情况下,可以从两个方面来判断数据库设计的是否规范: 1)一是看看是否拥有大量的窄表 窄表往往对于OLTP比较合适,符合范式设计原则 2)宽表的数量是否足够的少。 所谓的宽表就是字段比较多的表,包含的维度层次比较多,造成冗…

数据库设计实战(一):数据库设计规范

一、数据库设计流程 1、需求分析 确定用户对数据库系统的使用要求和各种约束条件,形成用户需求规约 2、概念设计 对用户要求描述的现实世界,通过对其分类、聚集和概括,建立抽象的概念数据模型 3、逻辑设计 将现实世界的概念数据模型设计…

详解数据库设计的四个阶段

一、系统需求分析阶段 数据库设计的第一步,就是了解与分析用户需求,确定系统边界信息需求、处理需求、安全性和完整性需求,然后编写系统分析报告。 系统分析报告的内容主要包括: 随系统分析报告需提供的附件还有: …

MySQL数据库设计-案例

大家好,我是忘鱼。分享一下数据库设计(案例) 目录 一、案例 二、代码 三、总结 一、案例 如下进行数据库设计。这是黑马上的一道练习题。 二、代码 drop table if EXISTS music; drop table if EXISTS song; drop table if EXI…

数据库设计流程

数据库设计的步骤 数据库设计的流程总共有三步: 现实世界的实体模型通过建模转换为信息世界的概念模型(即 E-R 模型)概念模型经过模型转化,得到数据库使用的数据模型(在关系数据库设计中为关系模型)数据模…

浅谈数据库设计

第一章 需求分析 设计简介 根据业务需要,结合选用的DBMS,设计出最有的数据存储模型并建立好数据库中的表结构及表与表之间的关系使之有效的存储和高效的访问。 数据库设计 在系统设计开始就应该对数据库进行良好的设计,这样才能保证以后对…

数据库设计与实现

一个良好的设计对于数据库系统至关重要,它可以减少数据冗余,确保数据的一致性和完整性,同时使得数据库易于维护和扩展。 实体关系图 实体关系图(Entity-Relationship Diagram,ERD)是一种用于数据库设计的结…

数据库设计(二)——简单设计实例

Mysql设计步骤 一、设计一套系统数据库的步骤 1、实现什么样的功能(保证项目功能的完整性,列出所有模块)。 2、通过思维导图将每个功能模块串联起来(放射状,细节可以用文字描述)。 …

数据库设计的一般步骤

经过几天给韶关某个高校进行数据库设计的实训,对数据库设计的过程有了更加深刻的理解。 一、数据库设计的步骤 (1)了解功能需求 在设计数据库之前,设计人员必须要先了解系统的功能需求。这里可以通过阅读产品需求规格说明书&…

9.数据库设计

数据库设计 1、数据库设计概述 数据库设计。广义地讲,是数据库及其应用系统的设计,即设计整个数据库应用系统;狭义地讲,是设计数据库本身,即设计数据库的各级模式并建立数据库, 这是数据库应用系统设计的一…

数据库设计-概念结构设计

文章目录 数据库设计概念设计结构概念结构设计ER模型的基本元素实体/实体集属性区别实体和属性联系 二元联系的关系1:11:nm:n 一元联系1:11:nm:n 三元联系 采用ER模型的概念设计设计局部ER模型例题设计全局ER模型全局ER模型的优化 数据库设计 数据库设计:构造最优的…

数据库设计—图书管理数据库系统设计

如下代码供学习交流,获取完整代码,请关注公众号(coding加油站)获取 1、项目简介 图书馆数据库,该项目同时提供pythonweb可视化展示界面,也可提供相关报告数据,可以用来作为数据库系统设计的期…

数据库设计(一)——数据库设计

一、数据库设计简介 按照规范设计,将数据库的设计过程分为六个阶段: A、系统需求分析阶段 B、概念结构设计阶段 C、逻辑结构设计阶段 D、物理结构设计阶段 E、数据库实施阶段 F、数据库运行与维护阶段 需求分析和概念结构设计独立于任何数据库管理系统…

数据库设计的六个基本步骤

按照规范设计的方法,考虑数据库及其应用系统开发全过程,可将数据库设计分为以下6个阶段,分别为:1.需求分析,2.概念结构设计,3.逻辑结构设计,4.物理结构设计,5.数据库实施&#xff0c…

数据库设计(一)

目录 数据库设计的基本概念: 数据库设计包括以下几个部分: 需求设计: 1、数据: 2、处理: 概念结构设计: 实体: 例如: 联系类型: 1、一对一: 2、一对多&a…

数据库:数据库设计(需求,设计,运行,维护)

1,数据库设计概述 1.1,数据库设计的基本概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据&…

数据库系统-数据库设计

数据库系统-数据库设计 数据库设计概述及六步骤简介 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求。 数据库设计的特点 数据库设计是一…

学生成绩管理系统数据库设计--MySQLSQL Server

MySQL 数据库设计-学生成绩管理系统 设计大纲友情链接 1、医疗信息管理系统数据库–MySQL2、邮件管理数据库设计–MySQL3、点餐系统数据库设计–SQL Server4、商品管理系统数据库设计–SQL Server5、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Ma…