文章

电子签章技术规范

电子签章技术规范

该文记录对安全电子签章密码技术规范的理解。

安全电子签章密码技术规范

  • GB/T 38540-2020 信息安全技术 安全电子签章密码技术规范
  • GM/T 0031-2014 安全电子签章密码技术规范

1. GB/T 38540

1.1. 电子印章

graph LR
    SESeal[电子印章] --> eSealInfo[印章信息]
    SESeal --> cert[制章者证书]
    SESeal --> signAlgID[签名算法标识]
    SESeal --> signedValue[签名值]
    eSealInfo --> header[印章头]
    eSealInfo --> esID[印章标识]
    eSealInfo --> properrty[印章属性]
    eSealInfo --> picture[印章图像数据]
    eSealInfo --> extDatas[自定义数据]
    header --> ID[头标识]
    header --> version[印章版本号]
    header --> Vid[厂商标识]
    properrty --> type[印章类型]
    properrty --> name[印章名称]
    properrty --> certListType[签章证书信息类型]
    properrty --> certList[签章证书信息列表]
    properrty --> createDate[制作时间]
    properrty --> validStart[有效起始日期]
    properrty --> validEnd[有效终止日期]
    picture --> pic_type[图像类型]
    picture --> data[图像数据]
    picture --> width[图像显示宽度]
    picture --> height[图像显示高度]

1.2. 电子签章

graph LR
    SES_Signature[电子签章] --> TBS_Sign[签章信息]
    SES_Signature --> cert[签章者证书]
    SES_Signature --> signatureAlgID[签名算法标识]
    SES_Signature --> signature[签名值]
    SES_Signature --> timeStamp[签名值时间戳]
    TBS_Sign --> version[电子签章版本]
    TBS_Sign --> eseal[电子印章]
    TBS_Sign --> timeInfo[签章时间]
    TBS_Sign --> dataHash[原文杂凑值]
    TBS_Sign --> propertyInfo[原文数据的属性]
    TBS_Sign --> extDatas[自定义数据]

2. GM/T 0031

2.1. 电子印章

graph LR
    SESeal[电子印章] --> SES_SealInfo[印章信息]
    SESeal --> SES_SignInfo[签名信息]
    SES_SealInfo --> header[头信息]
    SES_SealInfo --> esID[印章标识]
    SES_SealInfo --> property[属性信息]
    SES_SealInfo --> picture[印章图片信息]
    SES_SealInfo --> extDatas[自定义数据]
    header --> ID[数据标识]
    header --> version[数据版本号]
    header --> Vid[厂商ID]
    property --> type[印章类型]
    property --> name[印章名称]
    property --> certList[签章人证书列表]
    property --> createDate[印章制作日期]
    property --> validStart[有效起始日期]
    property --> validEnd[有效终止日期]
    picture --> pic_type[图片类型]
    picture --> data[图片数据]
    picture --> width[图片显示宽度]
    picture --> height[图片显示高度]
    SES_SignInfo --> cert[制章人证书]
    SES_SignInfo --> signatureAlgorithm[签名算法标识]
    SES_SignInfo --> signData[签名值]

2.2. 电子签章

graph LR
    SES_Signature[电子签章] --> TBS_Sign[签章信息]
    SES_Signature --> signature[签章签名值]
    TBS_Sign --> version[电子签章版本]
    TBS_Sign --> eseal[电子印章]
    TBS_Sign --> timeInfo[签章时间]
    TBS_Sign --> dataHash[原文杂凑值]
    TBS_Sign --> propertyInfo[原文数据的属性]
    TBS_Sign --> cert[签章人对应签名证书]
    TBS_Sign --> signatureAlgID[签名算法标识]

3. 分析

3.1. 电子印章

可以看到 GB/T 38540GM/T 0031 电子印章相关字段都是一样的,只是 GB/T 38540 的制章者证书,签名算法标识,签名值在外层,而 GM/T 0031 的制章者证书,签名算法标识,签名值在签名信息包裹。

为了区分两个标准的签章格式

  • 如果可以把 ASN1 格式解析为树形图,可以简单判别子节点个数,有四个是 GB/T 38540 只有两个是 GM/T 0031
  • 如果是依次解析,可以判断第一个节点后节点的类型,节点类型是 OCTET_STRING(0x04) 就是 GB/T 38540 ,而节点类型是 SEQUENCE 就是 GM/T 0031

4. 代码实现

https://github.com/august295/EnDeCode

参考

本文由作者按照 CC BY 4.0 进行授权