我认为学习协议要从三个方面来研究:
1、协议的目的、功能;
2、协议的数据包格式;
3、协议的工作流程。
下面从这三个方面来总结之前对SRTP协议的学习。
1、协议的目的和功能
SRTP协议的名称是安全实时传输协议,主要是针对实时的语音流、视频流在网络上传输的安全性开发,SRTP提供AES对称加密和HMAC算法认证。所以,SRTP协议的关键在于安全和实时。SRTP在RFC3771中有详细定义,在看SRTP之前,推荐先看RTP协议,定义在RFC3550中。
SRTP可以运行于TCP/UDP之上,但通常都是应用于UDP,因为语音、视频传输通常采用UDP。
2、协议的数据报文结构
数据报文包括包头、数据主体以及认证信息三个部分。
(1)32bits:
V 2bits 版本号,现在已经是版本2
P 1bit 填充位,当负载的长度不够32bits的整数倍时,需要填充位
X 1bit 扩展位,若为1,则固定的包头后增加一个32bits的扩展(rtp extension)
CC 4bits CSRC的数目
M 1bit 允许在比特流中标记重要的事件
PT 7bits 负载类型
序列号16bits 每发送一个RTP数据包,序列号加1,根据此来判断序列号的顺序
(2)时间戳 32bits
(3)SSRC标识符 32bits synchronizating source identifier 识别同步源
(4)CSRC标识符 n个32bits contributing source identifiers 识别负载重的有效贡献源
(5)可选存在的RTP extension
(6)加密的payload(末尾可能包含RTP padding和RTP pad count)
(7)包尾是SRTP MKI(可选),master key identifier,是用来生成session加密密钥的随机位串标识符。
(8)认证标签(Authentication tag)
与RTP包的主要区别是负载加密、SRTP MKI(主密钥标识符,由密钥管理协议决定)、认证标签。
3、协议的工作流程
(1)协议中涉及哪些密钥和重要参数
主密钥 master key
主密钥是一个长度不定的随机位串,用来生成会话密钥
会话密钥 session key
会话密钥就是用于消息加密和认证的密钥
master salt 不知道怎么翻译
salt是指一种在生成会话密码时的输入参数,salt增加了字典式攻击的难度,每增加1bit的salt,就会使字典攻击的难度和时间翻倍。
key_derivation_rate
生成会话密钥的速率,必须是{1,2,4,……2^24}中的一个,必须为2的幂数
<from,to>
这是两个48bits的时间值,表示master key的有效时间。
ROC(rollover counter)
记录序列号的重置次数,用来计算SRTP包的索引
Index = 2^16 * ROC + SEQ
(2)会话密钥的产生
在协议中,密钥生成过程的描述是通过数学函数来说明的,如下:
key_session = PRF (key_master, x);
r = index/key_derivation_rate;;//label长度8位
key_id = <label> || r;
x = key_id XOR master salt;
PRF是一个AES-cm的对称加密函数。
用框图表示,如下:
其中,IV=[ <label>||(index/key_derivation_rate)XOR master_salt ]*2^16
index=2^16*ROC+SEQ
对于生成的不同密钥,8位的label有不同的值:
session_en_key:消息加密密钥,<label>=0x00
session_au_key:消息认证密钥,<label>=0x01
session_salt_key:会话salt,<label>=0x02
(3)具体工作流程
得到会话密钥后,就可以对消息载荷进行安全操作了。
发送方工作流程:
1)确定加密上下文
2)根据ROC、加密上下文中的最高序列号以及RTP包中的序列号,确定SRTP包索引
index=2^16*ROC+SEQ
3)根据index确定master_key和master_salt(需要密钥管理协议)
4)根据密钥管理协议中的各个参数,通过密钥生成器,得到会话密钥
5)利用会话密钥和传输参数设定,对载荷进行加密,作为数据包中的加密载荷
6)如果MKI字段为1,则加入MKI字段
7)计算认证标签,并加在包尾
8)更新ROC和数据包索引
接收端流程
1)确定加密上下文
2)计算包索引
index=2^16*v+SEQ
v={ROC-1,ROC,ROC+1}/2^32
3)如果MKI字段为1,则根据MKI确定主密钥和主密钥salt,否则用index确定主密钥和salt
4)得到会话密钥
5)重播检查,利用index和重播列表来检查重播,如果为重播数据包,则丢弃,并记录log。
执行认证过程,如果不匹配,则丢弃,并记录log。
6)利用会话密钥解密数据载荷
7)根据index,更新ROC、最大序列号、加密上下文中的s_l值,需要时更新重播列表。
8)从数据包中删除MKI和认证标签。