蝴蝶密钥扩展(ButterflyExpansion)算法,用于为车辆持续生成PC证书。中国的CCSA标准《基于LTE的车联网无线通信技术 安全证书管理系统技术要求》使用了该算法。
bufferflyexpansio.png
在假名证书申请流程和下载流程的基础上,密钥衍生的补充流程如下,本标准对密钥衍生流程中所使用的算法提出了一种建议:

  • 1) V2X设备在生成PC申请请求时,使用非对称密钥算法生成两对种子公私密钥对:签名密钥对(a, A),和加密密钥对(p, P);并使用对称密钥算法生成两个对称密钥:签名对称密钥kS和加密对称密钥kE;
  • 2) V2X设备发送给PRA的PC申请请求中,包括了A、P、kS、kE;
  • 3) PRA对PC申请请求、EC证书或令牌等信息校验通过后,使用A、P、kS、kE进行第一轮扩展运算,公钥因子A与kS进行扩展计算,得到签名扩展公钥B,P与kE进行扩展计算,得到加密扩展公钥Q;如此进行若干轮扩展运算,得到(Bi,j,Qi,j);
  • 4) PRA向PCA发送PC签发请求时,将(Bi,j, Qi,j)逐一发送给PCA,用于签发批量的PC;
  • 5) PCA签发PC证书前,随机生成1对公私钥对(c, C),其中公钥分量C与若干个Bi,j逐一进行运算,得到完整公钥Si,j;
  • 6) PCA基于Si,j构造的ToBeSignedCertificate进行签发得到假名证书PCi,j,再用对应的Qi,j对PCi,j及c进行加密,对该密文使用PCA的私钥进行签名;
  • 7) PCA返回批量PC证书至PRA时,将若干个密文发送至PRA,PRA检查并筛选出该V2X设备对应的若干个密文消息,将其打包为PC证书下载应答;
  • 8) V2X设备收到PRA返回的PC证书下载应答后,使用步骤1)中生成的a和p,分别与kS和kE进行若干轮计算,得到bi,j和qi,j;
  • 9) 验证步骤5)中PCA签名的有效性,验证通过后,再使用qi,j解密对应的密文,得到PCi,j及c,最终使用bi,j与c计算得到PCi,j所对应的完整私钥si,j。
  • 注1: 下标(i,j)表示单个的假名证书所对应的i和j的组合。其中i为该假名证书所对应的周期,j为该假名证书在当前周期中对应的序号。
  • 注2: 以上所述“签名”的种子密钥对(公钥因子、私钥因子)、对称密钥、扩展密钥,用于衍生V2X设备假名证书PC内的完整公钥和对应的完整私钥。
  • 注3: 以上所述“加密”的种子密钥对(公钥因子、私钥因子)、对称密钥、扩展密钥,用于衍生一对公私钥,对PCA返回至V2X设备的PC证书等消息进行加密、解密。
    密钥衍生函数

符号表达说明
有一个公认的“基点”,表示为G;
椭圆曲线的阶数用l表示;
对于一个比特串b和数字n,bn表示通过将比特串b重复n次而形成的比特串;
对于比特串x,xINT表示x转换为整数,例如:如果x = 0101,则xINT = 5;
对于比特串x和数字n,x + n是xINT + n产生的比特串的简写,例如:如果x = 0100,则x + 1 = 0101,x + 2 = 0110,x + 3 = 0111,依此类推;
对于比特串x和y,x ⊕ y表示它们的按位异或,而x || y表示串联的比特串,例如:如果x = 0110且y = 1010,则x ⊕ y = 1100且x || y = 01101010;
对于128比特字符串k和m,Symm (k, m)表示使用对称加密算法得到的128比特密文,m为被加密的明文数据,k为对称密钥,使用128比特的分组大小;
对于数字m和n,m mod n表示对具有模数n的m进行模运算的结果,例如:如果m = 9且n = 2,则m mod n = 1。
密钥衍生函数
2个密钥衍生函数:签名函数fS和加密函数fE。2个函数的参数如下:

  • 对称加密算法Symm,具有128比特的输入和输出以及128比特的密钥,采用SM4分组密码算法,ECB/NoPadding工作模式。
  • 一个128比特的密钥,分别表示为fS函数的kS,和fE函数的kE。
  • l是一个256比特的整数,表示进行密钥衍生的椭圆曲线的基点的阶。
    两个函数的输入为(iINT, jINT)两个整数,其范围是(0 , 232-1)。

两个函数的输出为一个256比特的整数o,范围为(0 , l)。
两个函数过程如下:

  • a)将输入iINT和jINT转换为32比特的比特串i和j。
  • b)拼接下列128位的比特串xS(用于fS)或xE(用于fE)。
  • 1)xS = (032 || i || j || 032)
  • 2)xE = (132 || i || j || 032)
  • c)创建如下的临时输出yS(用于fS)或yE(用于fE)。输出为3×128 = 384比特的字符串。
  • 1)yS = (Symm(kS, xS+1)⊕(xS+1)) || (Symm(kS, xS+2)⊕(xS+2)) ||(Symm(kS, xS+3)⊕(xS+3))
  • 2)yE = (Symm(kE, xE+1)⊕(xE+1)) || (Symm(kE, xE+2)⊕(xE+2)) ||(Symm(kE, xE+3)⊕(xE+3))
    这里,“x + i”表达了“将八位位组字符串x转换为整数,该整数加i,然后将加了i之后的整数转换回八位位组字符串”。例如,如果xS = (032 || i || j || 032) = (0000 0000 0000 0000 0000 0000 0000 0000b || i || j || 0000 0000 0000 0000 0000 0000 0000 0000) ,则xS + 2 = (0000 0000 0000 0000 0000 0000 0000 0000 b || i || j || 0000 0000 0000 0000 0000 0000 0000 0010)
  • d)fS和fE的最终输出如下:
  • 1)fS(kS, iINT, jINT) = ySINT mod l
  • 2)fE(kE, iINT, jINT) = yEINT mod l

相关:
https://blog.csdn.net/zhushuanghe/article/details/121169472

本文链接地址:https://const.net.cn/689.html

标签: none

已有 6 条评论

  1. 方园 方园

    你好,想咨询一下站内的sm2 签名验签工具,没找到合适留言的地方,故在这里留言了,叨扰之处,还请见谅。

    目前在使用sm2,在网上找到了该网址,添加id 的那两个工具没有问题。想询问这两个没有使用 id 计算的工具。
    [SM2 在线签名生成工具](https://const.net.cn/tool/sm2/sm2-sign-with-sm3/)
    [SM2 在线验签工具](https://const.net.cn/tool/sm2/sm2-verify-with-sm3/)
    请问这里data 栏应该输入什么。

    在其他地方计算了一个签名,在该网站的 验签工具(不输id)里的data栏 输入 ZA || Data input 对应的 数据(并填写了其他数据),验签失败。
    试着在 data栏 输入 sm3(ZA || Data input)对应的数据, 验签也失败。

    (以下工具都是指该网址下的sm2 签名验签(没有id栏) 工具)
    在使用时,发现了一些疑惑的地方。
    令要处理的data 的长度大于32字节,前32字节用 data_pre表示
    在签名工具里,data栏填写 data_pre || randstr_1, 计算得到了 R,S
    在验签工具里,data栏填写 data_pre || randstr_2, 填写R,S,验签通过。
    (randstr_1 与 randstr_2 不相同)。
    因此可以猜测这对工具的data 只读取前32字节。

    以上。

    1. 标准的SM2签名验签都是对原始数据+userid等进行sm3 hash后进行的.工具见:
      https://const.net.cn/tool/sm2/sign/

      在(https://const.net.cn/tool/sm2/sm2-sign-with-sm3/)中,data可以输入前述sm3 hash后的数据直接进行签名或验签,两个工具之间可能在这里联系起来,应该是可以验签通过的.data 就是32字节的hash.

      因为是当时研究sm2写着玩的一个工具,其实我的这个实现部分源码都不记得了.

      1. 方园 方园

        我这里发现sm2-verify-with-sm3 的data 输入 sm3(ZA || Data input) 对应的数据会验签失败。

        我用的这个工具
        https://i.goto327.top/CryptTools/SM2.aspx
        这个工具在勾上 是否计算Z值后, 就是完整的计算流程, (同 https://const.net.cn/tool/sm2/sign/一样);
        计算签名后,会在结果那一栏 显示 hash, 而这个hash 就是sm3(ZA || Data input). 我自己验证了一下,计算的sm3结果与该网站显示的一样。

        将这个hash 填入 sm2-verify-with-sm3 的data栏,会显示验签失败。

        https://const.net.cn/tool/sm2/sign/ 默认数据的 sm3(ZA || Data input) 为:
        D4 EA E0 3E 4B 5A 92 31 85 01 75 E4 6E 4B 27 98 7B 55 58 29 11 2F 69 1D 1A 69 D9 FC 30 A1 E5 15

        1. 相信经过这么久你对国密这块也很熟悉了,别太纠结这个问题,咱们这个工具不一定对,因为当时是研究国密的时候,顺手写的一个小工具,重要的是你弄清楚了整个国密签名验签所经过的步骤.

          1. 方圆 方圆

            这个网站上的资料帮助了我很多。祝好,共勉。

          2. 很荣幸,也是因为当年在研究这一块儿的时候,发现基本没什么资料,所以整理了一些.

添加新评论