1. (uint32_t *)p+3,
计算原理,指针指向的地址向下移动三个位置,因为地址为4个字节的类型,向下移动三个,即移动了3*4=12个字节, 指针移向了新地址
2. (enc_start - (uint32_t *)hdr) << 2
3<<2=12
指针地址差左移两位,得到的结果正好是12
3. Srtp 要加密的区域是172-12=160 byte,即去除头部的长度
4. 校验,从RTP 头部地址hdr起,最终校验的值存放的地址为头地址加长度172,即为存放校验位的地址
auth_start = (uint32_t *)hdr;
auth_tag = (uint8_t *)hdr + *pkt_octet_len;
5. Srtp_protect function
加密部分,从去除头部地址12个字节的地方开始
char * hexstr;
hexstr = octet_string_hex_string(enc_start, enc_octet_len);
writelog("hexstr1=%s",hexstr); //加密前原文
if (enc_start) {
status = cipher_encrypt(stream->rtp_cipher,
(uint8_t *)enc_start, &enc_octet_len);
if (status)
return err_status_cipher_fail;
}
memset(hexstr,0,sizeof(hexstr));
hexstr = octet_string_hex_string(enc_start, enc_octet_len);
writelog("hexstr2=%s",hexstr);//加密后密文,长度不变
校验部分,从头部开始校验
if (auth_tag) {
writelog("srtp auth tag: %s", octet_string_hex_string(auth_tag, tag_len));
/* increase the packet length by the length of the auth tag */
*pkt_octet_len += tag_len;
writelog("srtp auth tag new length: %d", *pkt_octet_len); //长度增加
}
6. 调用srtp_protect
srtp_protect(sender_srtp_ctx, &rtp.header, &nLen);
a. &msg.header, rtp 头部地址
b. &nLen,加密前的数据长度
c. 做两件事情,
• 从去除头部长度的地址起,进行加密,加密后长度不变
• 从头部开始进行校验,生成auth tag, 拼接在数据的末尾
• 把数据的长度+auth tag len, nLen被变化
7. 发送数据
write_to((char *)&rtp, nLen, m_remote_addr, m_remote_data_port)
sendto(fd,
(const char *)buf, nLen, 0, (struct sockaddr *)&sockAddr, sizeof(struct sockaddr_in));
8. Srtp_unprotect
a. 确定要校验的开始位置,从头部开始
b. 确定要解密的开始位置和结束位置,从去除头部字节的地址开始,到auth tag 前结束
校验部分
status = auth_compute(stream->rtp_auth, (uint8_t *)&est, 4, tmp_tag);
writelog("computed auth tag: %s",octet_string_hex_string(tmp_tag, tag_len));//tag_len=4
writelog("packet auth tag: %s",octet_string_hex_string(auth_tag, tag_len));
解密部分
writelog("begin decrypt,enc_octet_len=%d",enc_octet_len);//160
writelog("content =%s",octet_string_hex_string(enc_start, enc_octet_len));
if (enc_start) {
status = cipher_encrypt(stream->rtp_cipher,
(uint8_t *)enc_start, &enc_octet_len);
writelog("content =%s",octet_string_hex_string(enc_start, enc_octet_len));
if (status)
return err_status_cipher_fail;
}
9. Writelog
static FILE *err_file = NULL;
void writelog(char *format, ...) {
va_list args;
va_start(args, format);
if (err_file == NULL) {
err_file = fopen("/srtp.log","w");
}
if (err_file != NULL) {
vfprintf(err_file, format, args);
fprintf(err_file, "\n");
}
}
分享到:
相关推荐
Configuring SRTP GES OPC Server and Cimplicity for PAC RX7i Communications This document highlights the basic configuration for the OPC server and
自己写的一个SRTP的实验的程序,参考数据 自己写的一个SRTP的实验的程序,参考数据 自己写的一个SRTP的实验的程序,参考数据自己写的一个SRTP的实验的程序,参考数据
已经将srtp移植到android 平台,
libsrtp是一个实现SRTP协议(Secure Real-time Transport Protocol,安全实时传输协议)的库。chrome的WebRTC就是基于SRTP协议实现的,libjingle也使用了libsrtp。
希望你能够通过这个ppt的学习了解srtp申请过程中的一些过程!
SRTP 游戏开发 源代码
去年我参加学校SRTP项目,结项想要搜些结项报告的模版,竟然找不到。所以我把精心总结的报告与大家共享。
SRTP项目的设计与实现—用科学研究的方法和技术技能解决电类学科的工程实践问题。
SRTP项目的设计与实现——用科学研究的方法和技术技能解决电类学科的工程实践问题。
跨平台libzrtp库,比srtp更安全,支持unix/linux, windows等平台
srtp的指导 可以帮助大家对申请srtp有一定的了解
SRTP协议实现代码,基本涵盖了SRTP的框架内容
srtp,一个RTP开源库,内含已经用VC7编译好的工程文件.
RTP数据包,将负载数据经过AES加密后加密后,在进行加密传输时,对方只要知道秘钥即可对加密数据解密
Secure Real-Time Transport Protocol源代码
libsrtp库函数,能够实现RTP,SRTP之间转换,并附有test文件
libsrtp1.5.4版本,可以做网络音视频或网络数据的加解密操作
包含内容: XBee Product Manual XCTU ver. 5.1.4.1 installer X-CTU调试说明文档 测试方法 接口命令集 ------------------------------------------------- 嵌入式系统开发过程中的参考资料,上传上来,需要的童鞋...
包含内容: 系统ARM 嵌入式源代码 在linux下进行gcc-linux-arm 编译 下载到arm上可以运行。 ------------------------------------------------- 嵌入式系统开发过程中的参考资料,上传上来,需要的童鞋参考。...
SRTP API在include / srtp.h中记录,而该库在libsrtp2.a中(编译后)。 本文描述了libSRTP,这是Cisco Systems,Inc.的开源安全RTP库。RTP是实时传输协议,它是用于传输实时数据(如电话,音频和视频)的IETF标准...