前言
在SCMS中提到了蝴蝶密钥扩展算法,用于为车辆持续生成PC证书。中国的CCSA标准《基于LTE的车联网无锡啊是你通信技术 安全证书管理系统技术要求》也采用了相同的算法,本文以CCSA的标准为准,简要记录。
背景
在V2X通信过程中,为了保证V2X消息的来源可信、内容可信,会由SCMS为车辆和路侧识设备颁发证书。其中给车辆颁发的是假名证书(PC)。为了保护车辆的位置隐私,假名证书的有效期很短(比如一周),同时每周内为同一辆车会颁发多张假名证书(比如20张)。
传统的PKI体系中,证书的创建流程:
(1)用户生成公私钥后,生成CSR(CSR中包含公钥)并发送给CA;
(2)CA使用自己的私钥对CSR中的tbs进行签名,生成证书后返回给用户
V2X中的假名证书PC不使用于上述流程,原因如下:
(1)PC的量非常巨大,而且有效期很短(如一周)。同时由于设备经常一次性申请多个时间段内的证书,如果采用传统流程,则设备需要创建大量的公私钥对,并且下载时也要下载大量的证书
(2)证书不便于撤销。传统的证书撤销方式,需要在CRL中包含所有被撤销证书的证书标识,这对于巨量的PC证书显然太低效了
为了解决这个问题,SCMS采用了密钥衍生的思路:对于一辆车,只需要生成一次密钥,作为种子提交给SCMS,SCMS即可用这个种子持续不断的为车辆衍生新的公私钥,也就可以不断签发新的证书,大大减小了设备端–云端的交互量。
具体过程
文字描述
在PC的证书请求中,包含了一个SM2签名公钥种子 A A A,一个SM2加密公钥种子 P P P,一个SM4签名对称密钥 k S k_S kS,一个SM4加密对称密钥 k E k_E kE。证书由PCA生成,使用加密公钥加密,以防止RA获取PC内容。
给定椭圆曲线的基点 G G G,阶 l l l。卡特彼勒密钥对是一个整数 a a a和一个点 A = a G A=aG A=aG。证书请求者提供 A A A以及扩展函数 f k ( ι ) f_k(\iota) fk(ι)。 f k ( ι ) f_k(\iota) fk(ι)是一个对 l l l取模的整数伪随机序列。 ι \iota ι是一个迭代器。
在当前针对签名密钥的扩展函数设计中,
f
k
(
i
)
f_k(i)
fk(i)用于生成在
S
M
2
SM2
SM2曲线上的点,定义如下:
f
k
(
ι
)
=
f
k
i
n
t
(
ι
)
m
o
d
l
,
{f}_{k}(\iota) = \mathrm {f}_{k}^{int}(\iota) \;\mathrm {mod}\;l,
fk(ι)=fkint(ι)modl,
-
f
k
i
n
t
(
ι
)
{f}_{k}^{int}(\iota)
fkint(ι)是一个大端整数,表示如下:
D M k ( x + 1 ) ∥ D M k ( x + 2 ) ∥ D M k ( x + 3 ) {DM}_{k}(x+1) \; \| \; \mathrm {DM}_{k}(x+2) \; \| \; \mathrm {DM}_{k}(x+3) DMk(x+1)∥DMk(x+2)∥DMk(x+3) -
D
M
k
(
m
)
DM_k(m)
DMk(m)是使用密钥
k
k
k对
m
m
m进行SM4(ECB/NoPadding)加密后的输出再与
m
m
m进行异或:
D M k ( m ) = S M 4 k ( m ) ⊕ m DM_k(m) = SM4_k(m) \oplus m DMk(m)=SM4k(m)⊕m - x + 1 , x + 2 , x + 3 x+1, x+2, x+3 x+1,x+2,x+3就是对 x x x单纯的加1
- SM4的输入值 x x x是一个128bit的串,由时间周期i和同一个时间周期内OBU的证书数量j决定的: ι = ( i , j ) 表 示 : ( 0 32 ∣ ∣ i ∣ ∣ j ∣ ∣ 0 32 ) \iota = (i,j)表示:(0^{32}||i||j||0^{32}) ι=(i,j)表示:(032∣∣i∣∣j∣∣032)
加密密钥的扩展函数定义和上面的一样,只有 x x x的定义不同: ι = ( i , j ) 表 示 : ( 1 32 ∣ ∣ i ∣ ∣ j ∣ ∣ 0 32 ) \iota = (i,j)表示:(1^{32}||i||j||0^{32}) ι=(i,j)表示:(132∣∣i∣∣j∣∣032)
RA此时可以产生128bi的公钥茧: B ι = A + f k ( ι ) ∗ G B_{\iota} = A + f_k(\iota)*G Bι=A+fk(ι)∗G,对应的私钥: b ι = a + f k ( ι ) b_{\iota}=a+f_k({\iota}) bι=a+fk(ι)。因为PC证书请求中只有公钥因子,所以RA只能获取到公钥,私钥只有OBU能获取到。
如果PCA没有改变这些扩展的公钥,那么RA(它知道哪些公钥来自哪个请求)就可以识别证书中的这些公钥并跟踪OBU。为了避免这种情况,对于每一个公钥茧:$B_{\iota}
,
P
C
A
产
生
一
个
随
机
数
,PCA产生一个随机数
,PCA产生一个随机数c_{\iota}
,
并
计
算
,并计算
,并计算C_{\iota}=c_{\iota}G$。Bι,。butterfly 公钥:
B
ι
′
=
B
ι
+
C
ι
B^{'}_{\iota} = B_{\iota}+C_{\iota}
Bι′=Bι+Cι
PCA会使用加密公钥对PC证书以及随机数
c
ι
c_{\iota}
cι加密后发送给RA,RA打包后供OBU下载。
OBU重建私钥:
b
ι
′
=
b
ι
+
c
ι
b^{'}_{\iota} = b_{\iota}+c_{\iota}
bι′=bι+cι
PC生成的整体流程:
-
OBU生成签名公私钥因子和加密公私钥因子:
A = a G A=aG A=aG
P = p G P=pG P=pG -
OBU将 A , P , k S , k E A,P, k_S, k_E A,P,kS,kE构成PC证书请求,使用EC签名后发送给RA
-
RA使用butterfly key进行公钥扩展,生成128的签名公钥茧 B ι B_{\iota} Bι和加密公钥茧 B ι B_{\iota} Bι:
B ι = A + f k ( ι ) ∗ G 签 名 公 钥 茧 B_{\iota} = A + f_k(\iota)*G \;\;\;签名公钥茧 Bι=A+fk(ι)∗G签名公钥茧
J ι = H + f e ( ι ) ∗ G 加 公 钥 茧 J_{\iota} = H + f_e(\iota)*G \;\;\;加公钥茧 Jι=H+fe(ι)∗G加公钥茧其中,
f k ( ι ) = f k i n t ( ι ) m o d l , {f}_{k}(\iota) = \mathrm {f}_{k}^{int}(\iota) \;\mathrm {mod}\;l, fk(ι)=fkint(ι)modl,f k i n t ( ι ) {f}_{k}^{int}(\iota) fkint(ι)是一个大端整数,表示如下:
f k i n t ( ι ) = D M k ( x + 1 ) ∥ D M k ( x + 2 ) ∥ D M k ( x + 3 ) {f}_{k}^{int}(\iota)={DM}_{k}(x+1) \; \| \; \mathrm {DM}_{k}(x+2) \; \| \; \mathrm {DM}_{k}(x+3) fkint(ι)=DMk(x+1)∥DMk(x+2)∥DMk(x+3)
D M k ( m ) DM_k(m) DMk(m)是使用密钥 k k k对 m m m进行SM4加密后的输出再与 m m m进行异或:
D M k ( m ) = S M 4 k ( m ) ⊕ m DM_k(m) = SM4_k(m) \oplus m DMk(m)=SM4k(m)⊕m
SM4的输入值
x
x
x是一个128bit的串,由时间周期i和同一个时间周期内OBU的证书数量j决定的:
ι
=
(
i
,
j
)
=
(
0
32
∣
∣
i
∣
∣
j
∣
∣
0
32
)
\iota = (i,j)=(0^{32}||i||j||0^{32})
ι=(i,j)=(032∣∣i∣∣j∣∣032)
加密密钥的扩展函数定义和上面的一样,只有
x
x
x的定义不同:
ι
=
(
i
,
j
)
表
示
:
(
1
32
∣
∣
i
∣
∣
j
∣
∣
0
32
)
\iota = (i,j)表示:(1^{32}||i||j||0^{32})
ι=(i,j)表示:(132∣∣i∣∣j∣∣032)
4. RA将公钥茧$B_{\iota} $ 发送给PCA
5. PCA产生随机数
c
ι
c_{\iota}
cι,并计算
C
ι
=
c
ι
G
C_{\iota}=c_{\iota}G
Cι=cιG。Bι,。得到公钥:
B
ι
′
=
B
ι
+
C
ι
B^{'}_{\iota} = B_{\iota}+C_{\iota}
Bι′=Bι+Cι
6. PCA使用加密公钥对PC证书以及随机数
c
ι
c_{\iota}
cι加密后发送给RA,RA打包后供OBU下载(每张PC证书和私钥重建因子都用不同的加密公钥加密)。
7. OBU下载PC证书包,先重建加密私钥对证书包解密,解密后重建签名私钥:
b
ι
′
=
b
ι
+
c
ι
b^{'}_{\iota} = b_{\iota}+c_{\iota}
bι′=bι+cι