开放监视设备协议(OSDP)是安全行业协会(SIA)为提高访问控制和安全产品之间的互操作性而开发的访问控制通信标准。OSDP v2.1.7目前正在成为美国国家标准协会(ANSI)认可的标准,并且OSDP正在不断改进以保持行业领先地位。
与普通的低安全性传统协议相比,新兴的OSDP标准提供:
所有消息,无论来源如何,都共享相同的结构。
字节 |
名称 |
含义 |
值 |
0 |
SOM |
消息开始 |
0x53 |
1 |
ADDR |
物理地址 |
0x00 - 0x7E (0x7F可配置) |
2 |
LEN_LSB |
数据包长度低字节 |
|
3 |
LEN_MSB |
数据包长度高字节 |
|
4 |
CTRL |
消息控制信息 |
|
|
SEC_BLK_LEN(可选) |
安全控制块的长度 |
|
|
SEC_BLK_TYPE(可选) |
安全块类型 |
|
|
SEC_BLK_DATA(可选) |
安全块数据 |
|
|
DATA(可选) |
数据块 |
|
|
MAC [0] |
Mac地址 |
|
|
MAC [1] |
|
|
|
MAC [2] |
|
|
|
MAC [3] |
|
|
|
CKSUM / CRC_LSB |
校验和,或CRC-16低字节 |
|
|
CRC_MSB(可选) |
CRC-16高字节 |
|
加密通信流程讲解:
OSDP加密通信的流程:采样对称加密的方式:使用的是AES128算法加密,AES常见的对称加密算法。还有非对称加密算法,如RSA等,还有哈希散列算法,如MD5 SHA256等(注,散列算法不属于加密算法,主要做数字签名等,具有不可逆性。
CP 主控设备 PD 子控设备
1) CP在本地生成一个随机数RND.A(8个字节的随机数),通过OSDP_CHLG(0x76)命令将RND.A传递给PD设备;
2) PD在收到CP的OSDP_CHLG命令后,在本地生成一个随机数RND.B(8个字节的随机数);然后根据RND.A、RND.B
SCBK三个值,生成一组加密密钥组:
S-ENC(数据机密性密钥) = Enc({0x01,0x82,RND.A[0-5], 0,...共16字节}, SCBK);
S-MAC1(消息认证密钥1) = Enc({0x01,0x01,RND.A[0-5], 0,...共16字节}, SCBK);
S-MAC2(消息认证密钥2) = Enc({0x01,0x02,RND.A[0-5], 0,...共16字节}, SCBK);
SERVER-CRYPTOGRAM(服务端密钥) = Enc(RND.B[0-8] || RND.A[0-8], S-ENC);
CLIENT-CRYPTOGRAM(客服端密钥) = Enc(RND.A[0-8] || RND.B[0-8], S-ENC);
然后将PD的cUID(客服端的序列号)和RND.B及CLIENT-CRYPTOGRAM通过OSDP_CCRYPT(0x76)命令发送给CP。
3) CP收到PD的序列号、随机数B及客服端密钥后,根据RND.A、RND.B和SCBK三个值,同样生成一组加密密钥组:
S-ENC(数据机密性密钥) = Enc({0x01,0x82,RND.A[0-5], 0,...共16字节}, SCBK);
S-MAC1(消息认证密钥1) = Enc({0x01,0x01,RND.A[0-5], 0,...共16字节}, SCBK);
S-MAC2(消息认证密钥2) = Enc({0x01,0x02,RND.A[0-5], 0,...共16字节}, SCBK);
SERVER-CRYPTOGRAM(服务端密钥) = Enc(RND.B[0-8] || RND.A[0-8], S-ENC);
CLIENT-CRYPTOGRAM(客服端密钥) = Enc(RND.A[0-8] || RND.B[0-8], S-ENC);
然后判断生成的CLIENT-CRYPTOGRAM(客服端密钥)与接收的客服端密码是否相同,若相同则通过OSDP_SCRYPT命
令将CP生成的SERVER-CRYPTOGRAM(服务端密钥)发送给PD设备。
4) PD接收到CP的服务器密钥,将其与本地生成的服务器密钥比较,若相同则通过OSDP_MAC_I命令返回MAC_I
发送给CP设备。MAC_I = Enc(S-MAC1, S-SERVERCRYPTOGRAM, S-MAC2)
5) CP接收到PD是MAC_I(16个字节)数据,将其保存到CP的维护R-MAC中。使用OSDP的加密通信,在会话完成后,
进行数据通信是一定要带上MAC,这里的MAC有点像哈希散列的效果,主要用于数据内容的数据摘要,即校验
数据是否被修改。并且是使用上次是MAC作为当前MAC计算的依据,保证了数据包的连续性,及若其中一包消
息,则数据通信立即停止。
C-MAC: Command MAC (for packets from CP to PD)
R-MAC: Reply MAC (for packets from PD to CP)
注意:CP和PD分别各自都维护两个MAC,C-MAC和R-MAC。
在CP中的R-MAC作为存放PD回复的R-MAC使用,并为发送的C-MAC提供加密参数。
C-MAC = Enc(R-MAC, S-MAC1, S-MAC2, DATA, DATA_LEN);
在PD中的C-MAC作为存放CP请求的C-MAC使用,并为发送的R-MAC提供加密参数。
R-MAC = Enc(C-MAC, S-MAC1, S-MAC2, DATA, DATA_LEN);
注意:在OSDP中使用加密通信时,加密块SEC_BLK_DATA[0]的值(0:代表使用SCBK_D加密,1:代表使用自定义SCBK加密)
SEC_BLK_DATA[1]-SEC_BLK_DATA[16]为加密的SCBK的值;
SEC_BLK_TYPE为加密的通道类型:
0x11:新建一个会话连接,CP->PD
0x12:回复新建会话连接,PD->CP
0x13:确认当前会话连接,CP->PD
0x14:回复确认会话连接,PD->CP (代表会话已完成)
0x15:安全会话消息. 带上MAC, PAYLOAD不加密,CP->PD
0x16:安全会话消息. 带上MAC, PAYLOAD不加密,PD->CP
0x17:安全会话消息. 带上MAC, PAYLOAD加密,CP->PD
0x18:安全会话消息. 带上MAC, PAYLOAD加密,PD->CP
SEC_BLK_TYPE = 0x17 和 0x18的时候,需要对PAYLOAD数据进行加密,这个加密也是使用AES加密。
在CP中:加密时:ICV = ~R-MAC,解密时:ICV = ~C-MAC
在PD中:加密时:ICV = ~C-MAC,解密时:ICV = ~R-MAC
PAYLOAD的加密:PAYLOAD-ENC = Enc(ICV, S-ENC, DATA, DATA_LEN);
PAYLOAD的解密:PAYLOAD-DEC = Dec(ICV, S-ENC, DATA, DATA_LEN);
由此可知:服务器密钥和客服端密钥是在会话期间使用,用于验证CP和PD之间的连接。S-MAC1 S-MAC2主要用于生成
R-MAC和C-MAC,用于消息摘要检验。而S-ENC主要用于PAYLOAD数据加解密使用的。
一些常见术语解释:
CUID:客户端唯一标示符(可以理解为序列号),推荐为供应商代码(3),型号(1),版本(1),序列号LSB(3)。
MK:主密钥,仅在会话初始化期间使用。
SCBK: 安全通道基本密钥, 仅在会话初始化期间使用。
SCBK = Enc(cUID ||(~cUID),MK)
RND.A[8]:CP生成的8位随机数。
RND.B[8]:PD生成的8位随机数。
MAC_I:MAC_I是在安全信道会话期间使用的波动的MAC的初始值。它是通过使用S-MAC1加密在osdp_SCRYPT中接收的服务器密码来计算的,然后使用S-MAC2加密结果。
MAC_I = ENC((ServerCryptogram, S-MAC1), S-MAC2) //待验证
填充是必需的,因为AES-128算法仅在以16字节为位权的数据块上运行。
DATA字段的填充:
将字符0x80附加到数据块,然后继续附加所需的0x00字符数,以使数据块的大小可以被块大小16整除。若原始数据块的长度刚好可被16整除,如16, 32等,则将去填充扩大一倍,如原本数据块长度为16,则填充后是32。
共享SCBK_D密钥示例=“303132333435363738393A3B3C3D3E3F”
CP生成一个8字节的随机数:“B0B1B2B3B4B5B6B7”
osdp_CHLG(530013000D03110076B0B1B2B3B4B5B6B73177):
在PD内:
- 生成8个字节的随机数;本次会话生成“A0A1A2A3A4A5A6A7”
- 生成会话密钥
o SMAC1 - 5e 86 c6 76 60 3b de e2 d8 be af e1 78 63 73 32
o SMAC2 - 6f da 86 e8 57 77 7e 81 13 20 35 75 82 39 17 2e
o ENC - bf 8d c2 a8 32 9a cb 8c 67 c6 d0 cd 9a 45 16 82
- 生成主机密码(保留在内存中):26 d3 35 6e 07 76 2d 26 28 01 fc 8e 66 65 a8 91
- 生成卡密码:fd e5 d2 f4 28 ec 16 31 24 71 ea 3c 02 bd 77 96
对osdp_CHLG的响应是:
53802B000D0312007600068E0000000000A0A1A2A3A4A5A6A7FDE5D2F428EC16312471EA3C02BD7796 F81E
osdp_SCRYPT(53001B000E0313007726D3356E07762D262801FC8E6665A89140B4):
在PD内:
- 验证主机(26D3356E07762D262801FC8E6665A891)发送的密码与存储在内存中的密码(请参阅osdp_CHLG)
- 生成RMAC。 RMAC是通过SMAC-1加密主机密码生成的,然后使用SMAC-2对该加密的结果进行加密。对于此示例会话,RMAC的值将为“b2 a3 00 57 eb 98 ba 22 29 ec 1f 87 56 62 b5 24”
对osdp_SCRYPT的响应是:
53801B000E03140178 B2A30057EB98BA2229EC1F875662B524 6EEB
osdp_CHLG(530013000D03110076B0B1B2B3B4B5B6B73177):
0x53
0x00
0x13 0x00
0x0D // 1101 包含SB(1)、包含校验(1)、序列号为01
0x03 //SB长度
0x11 //SCS_11
0x00 //指定SCBK_D密钥
0x76 // osdp_CHLNG
B0B1B2B3B4B5B6B7 //8位随机数RND.A
0x31 0x73 //CRC校验码
对osdp_CHLG的响应是:
53802B000D0312007600068E0000000000 A0A1A2A3A4A5A6A7 FDE5D2F428EC16312471EA3C02BD7796 F81E
0x53
0x80 //0x00 + 0x80
0x2B 0x00
0x0D // 1101 包含SB(1)、包含校验(1)、序列号为01
0x03 //
0x12 //SCS_12
0x00 //指定SCBK_D
0x76 //osdp_CCRYPT
00068E0000000000 //8位cUID
A0A1A2A3A4A5A6A7 //8位随机数RND.B
FDE5D2F428EC16312471EA3C02BD7796 //16字节客户端密码
0xF8 0x1E //校验码
osdp_SCRYPT(53001B000E0313007726D3356E07762D262801FC8E6665A89140B4)
0x53
0x00
0x1B 0x00
0x0E //1110 包含SB(1)、包含校验(1)、序列号为2(10)
0x03
0x13 //SCS_13
0x00
0x77 // osdp_SCRYPT
26D3356E07762D262801FC8E6665A891 //16位服务器密码server Cryptogram
0x40 0xB4 //校验码
Respon 53801B000E03140178 B2A30057EB98BA2229EC1F875662B524 6EEB
0x53
0x80
0x1B
0x00
0x0E
0x03
0x14
0x01 //密码核对正确
0x78 // osdp_RMAC_I
B2A30057EB98BA2229EC1F875662B524 //16位R-MAC
0x6E 0xEB //校验码