SCMS中的蝴蝶密钥扩展算法(CCSA版本)

前言

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,

  1. 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)
  2. 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
  3. x + 1 , x + 2 , x + 3 x+1, x+2, x+3 x+1,x+2,x+3就是对 x x x单纯的加1
  4. 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)(032ij032)

加密密钥的扩展函数定义和上面的一样,只有 x x x的定义不同: ι = ( i , j ) 表 示 : ( 1 32 ∣ ∣ i ∣ ∣ j ∣ ∣ 0 32 ) \iota = (i,j)表示:(1^{32}||i||j||0^{32}) ι=(i,j)(132ij032)

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产生一个随机数 PCAc_{\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生成的整体流程:

  1. OBU生成签名公私钥因子和加密公私钥因子:
    A = a G A=aG A=aG
    P = p G P=pG P=pG

  2. OBU将 A , P , k S , k E A,P, k_S, k_E AP,kS,kE构成PC证书请求,使用EC签名后发送给RA

  3. 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)=(032ij032)

加密密钥的扩展函数定义和上面的一样,只有 x x x的定义不同: ι = ( i , j ) 表 示 : ( 1 32 ∣ ∣ i ∣ ∣ j ∣ ∣ 0 32 ) \iota = (i,j)表示:(1^{32}||i||j||0^{32}) ι=(i,j)(132ij032)
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ι

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值