如何调用接口实现RTMP推送和播放端AES或SM4加解密

首先介绍下AES算法和SM4算法:

AES算法

密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密算法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPSPUB197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES有一个固定的128位的块大小和128,192或256位大小的密钥大小。

该算法为比利时密码学家JoanDaemen和VincentRijmen所设计,结合两位作者的名字,以Rijndael命名之。AES在软件及硬件上都能快速地加解密,相对来说较易于操作,且只需要很少的存储空间。作为一个新的加密标准,目前正被部署应用到更广大的范围。

SM4算法

SM4算法全称为SM4分组密码算法,是国家密码管理局2012年3月发布的第23号公告中公布的密码行业标准。SM4算法是一个分组对称密钥算法,明文、密钥、密文都是16字节,加密和解密密钥相同。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密过程与加密过程的结构相似,只是轮密钥的使用顺序相反。

SM4算法的优点是软件和硬件实现容易,运算速度快。

大多开发者对大牛直播SDK RTMP AES或SM4加解密接口还不太熟悉,本文以Windows RTMP推送和RTMP播放为例,介绍下相关的接口:

Windows RTMP推送端:

  1. SetRtmpEncryptionOption:设置RTMP推送加密选项,比如可只加密音频或视频,也可同时加密;

  2. SetRtmpEncryptionAlgorithm:设置RTMP加密算法,可选的算法为AES或SM4,如不设定,默认选择AES;

  3. SetRtmpEncryptionKey:设置rtmp推送加密密钥,key:加密密钥,key_size: 如果加密算法是aes, key_size必须是16, 24, 32 这三个值, 其他返回错误; 如果加密算法是sm4, key_size必须是16, 其他值返回错误;

  4. SetRtmpEncryptionIV:设置rtmp推送加密IV(初始化向量), 这个接口不调用的话, 将使用默认IV。

详细的接口描述如下:

        /*
        设置rtmp推送加密选项
        url: 考虑到可能推送到多个服务器,可以根据推送url配置不同的加密选项, 请确保url和SetURL一致
        is_encrypt_video: 1:表示视频加密, 0:表示视频不加密, 默认不加密, 其他值返回错误
        is_encrypt_audio: 1:表示音频加密, 0:表示音频不加密, 默认不加密, 其他值返回错误
        成功返回 NT_ERC_OK
        */
        NT_UINT32(NT_API *SetRtmpEncryptionOption)(NT_HANDLE handle, NT_PCSTR url, NT_INT32 is_encrypt_video, NT_INT32 is_encrypt_audio);

        /*
        设置rtmp加密算法
        url: 考虑到可能推送到多个服务器,可以根据推送url配置不同的加密选项, 请确保url和SetURL一致
        encryption_algorithm: 加密算法, 当前支持aes和国标sm4\. 1为aes, 2为sm4, 默认为aes.
        */
        NT_UINT32(NT_API *SetRtmpEncryptionAlgorithm)(NT_HANDLE handle, NT_PCSTR url, NT_INT32 encryption_algorithm);

        /*
        设置rtmp推送加密密钥
        url: 考虑到可能推送到多个服务器,可以根据推送url配置不同的加密选项, 请确保url和SetURL一致
        key:加密密钥
        key_size: 如果加密算法是aes, key_size必须是16, 24, 32 这三个值, 其他返回错误; 如果加密算法是sm4, key_size必须是16, 其他值返回错误.
        成功返回 NT_ERC_OK
        */
        NT_UINT32(NT_API *SetRtmpEncryptionKey)(NT_HANDLE handle, NT_PCSTR url, const NT_BYTE* key, NT_UINT32 key_size);

        /*
        设置rtmp推送加密IV(初始化向量), 这个接口不调用的话, 将使用默认IV
        url: 考虑到可能推送到多个服务器,可以根据推送url配置不同的加密选项, 请确保url和SetURL一致
        iv: 初始化向量
        iv_size: 当前必须是16, 其他值返回错误
        成功返回 NT_ERC_OK
        */
        NT_UINT32(NT_API *SetRtmpEncryptionIV)(NT_HANDLE handle, NT_PCSTR url, const NT_BYTE* iv, NT_UINT32 iv_size);

Windows RTMP播放端:

1. 设置加密的AES或SM4的Key和IV初始化向量:

        /*
        *
        * 设置解密key,目前只用来解密rtmp加密流
        * key: 解密密钥
        * size: 密钥长度
        * 成功返回NT_ERC_OK
        */
        NT_UINT32(NT_API *SetKey)(NT_HANDLE handle, const NT_BYTE* key, NT_UINT32 size);

        /*
        *
        * 设置解密向量,目前只用来解密rtmp加密流
        * iv:  解密向量
        * size: 向量长度
        * 成功返回NT_ERC_OK
        */
        NT_UINT32(NT_API *SetDecryptionIV)(NT_HANDLE handle, const NT_BYTE* iv, NT_UINT32 size);

image.gif

2. 相关Event ID:如检测到推送的RTMP流系AES或SM4加密,会回调上来NT_SP_E_EVENT_ID_NEED_KEY事件,弹出输入Key和IV框,如输入的Key和IV不正确,播放端会收到NT_SP_E_EVENT_ID_KEY_ERROR事件。

NT_SP_E_EVENT_ID_NEED_KEY               = NT_SP_E_EVENT_ID_BASE | 0xC,  /*需要输入解密key才能播放*/
NT_SP_E_EVENT_ID_KEY_ERROR              = NT_SP_E_EVENT_ID_BASE | 0xD,  /*解密key不正确*/

/*事件ID*/
typedef enum _NT_SP_E_EVENT_ID
{
    NT_SP_E_EVENT_ID_BASE = NT_EVENT_ID_SMART_PLAYER_SDK,

    NT_SP_E_EVENT_ID_CONNECTING             = NT_SP_E_EVENT_ID_BASE | 0x2,  /*连接中*/
    NT_SP_E_EVENT_ID_CONNECTION_FAILED      = NT_SP_E_EVENT_ID_BASE | 0x3,  /*连接失败*/
    NT_SP_E_EVENT_ID_CONNECTED              = NT_SP_E_EVENT_ID_BASE | 0x4,  /*已连接*/
    NT_SP_E_EVENT_ID_DISCONNECTED           = NT_SP_E_EVENT_ID_BASE | 0x5,  /*断开连接*/
    NT_SP_E_EVENT_ID_NO_MEDIADATA_RECEIVED  = NT_SP_E_EVENT_ID_BASE | 0x8,  /*收不到RTMP数据*/
    NT_SP_E_EVENT_ID_RTSP_STATUS_CODE       = NT_SP_E_EVENT_ID_BASE | 0xB,  /*rtsp status code上报, 目前只上报401, param1表示status code*/
    NT_SP_E_EVENT_ID_NEED_KEY               = NT_SP_E_EVENT_ID_BASE | 0xC,  /*需要输入解密key才能播放*/
    NT_SP_E_EVENT_ID_KEY_ERROR              = NT_SP_E_EVENT_ID_BASE | 0xD,  /*解密key不正确*/

    /* 接下来请从0x81开始*/
    NT_SP_E_EVENT_ID_START_BUFFERING = NT_SP_E_EVENT_ID_BASE | 0x81, /*开始缓冲*/
    NT_SP_E_EVENT_ID_BUFFERING       = NT_SP_E_EVENT_ID_BASE | 0x82, /*缓冲中, param1 表示百分比进度*/
    NT_SP_E_EVENT_ID_STOP_BUFFERING  = NT_SP_E_EVENT_ID_BASE | 0x83, /*停止缓冲*/

    NT_SP_E_EVENT_ID_DOWNLOAD_SPEED  = NT_SP_E_EVENT_ID_BASE | 0x91, /*下载速度, param1表示下载速度,单位是(Byte/s)*/

    NT_SP_E_EVENT_ID_PLAYBACK_REACH_EOS     = NT_SP_E_EVENT_ID_BASE | 0xa1, /*播放结束, 直播流没有这个事件,点播流才有*/
    NT_SP_E_EVENT_ID_RECORDER_REACH_EOS     = NT_SP_E_EVENT_ID_BASE | 0xa2, /*录像结束, 直播流没有这个事件, 点播流才有*/
    NT_SP_E_EVENT_ID_PULLSTREAM_REACH_EOS   = NT_SP_E_EVENT_ID_BASE | 0xa3, /*拉流结束, 直播流没有这个事件,点播流才有*/

    NT_SP_E_EVENT_ID_DURATION               = NT_SP_E_EVENT_ID_BASE | 0xa8, /*视频时长,如果是直播,则不上报,如果是点播的话, 若能从视频源获取视频时长的话,则上报, param1表示视频时长,单位是毫秒(ms)*/

} NT_SP_E_EVENT_ID;
image.gif

Demo使用:

Windows RTMP推送端(以采集推送屏幕为例):

如何调用接口实现RTMP推送和播放端AES或SM4加解密_第1张图片
image
image.gif

Windows RTMP播放端,如检测到是加密流,会自动弹出输入Key和IV的框,输入正确的信息即可正常播放RTMP音视频流:

如何调用接口实现RTMP推送和播放端AES或SM4加解密_第2张图片
image

更多资料参考Github: https://github.com/daniulive/SmarterStreaming

或者官网:https://www.daniulive.com

QQ群:

  • 大牛直播精英群: 294891451
  • 大牛直播技术交流群: 499687479

你可能感兴趣的:(如何调用接口实现RTMP推送和播放端AES或SM4加解密)