SM2无证书及隐式证书公钥机制签名和加密过程详解(三)

news/2024/10/5 18:25:23 标签: 安全, 密码测评

在对隐式证书ASN.1模板和生成过程进行说明后(SM2无证书及隐式证书公钥机制签名和加密过程详解(二)-CSDN博客),进一步介绍用于隐式证书编码的COER。

(3)COER编码
ASN.1模板可采用多种编码形式,如比较熟悉的BER、DER和PER等,隐式证书使用OER(Octet Encoding Rules)。OER标准存在两个不同版本,即Basic OER和Canonical OER(COER),其中COER特点是抽象值与编码内容之间一一对应。

以下使用几个ASN.1基本类型的实例来说明COER编码过程。

INTEGER类型

A ::= SEQUENCE {
    a1        INTEGER(0..100),
    a2        INTEGER(-290..390),
    a3        INTEGER(0..60000) OPTIONAL,
    a4        INTEGER(-5000000..5000000),
    a5        INTEGER(1000..MAX),
    a6        INTEGER(-1..MAX),
    a7        INTEGER    OPTIONAL
}

a A ::= {
    a1    4,
    a2    4,
    a3    4,
    a4    4,
    a5    1024,
    a6    4,
    a7    4
}

a的COER编码过程如下:
1)a是A类型的参数,是一个序列(SEQUENCE),不存在扩展标记(...),所以前导项中不存在扩展位。
2)a3和a4有 OPTIONAL标记,所以前导项中有位图(bitmap)。
3)a中a3和a4都被启用,所以对应bitmap置为1。
--0xC0, '1100 0000'
4)a1编码为0x04,a1的取值范围1个八位。
5)a2编码为0x0004,a2的取值范围2个八位。
6)a3编码为0x0004,a3的取值范围2个八位。
7)a4编码为0x00000004,a4的取值范围4个八位。
8)a5编码为0x020400,0x02是长度表示2个八位,0x0400是具体内容。
9)a6编码为0x0104,0x01是长度表示1个八位,0x04是具体内容(变长)。
10)a7编码为0x0104,0x01是长度表示1个八位,0x04是具体内容(变长)。
--0xC004000400040000000402040001040104

STRING类型

B ::= SEQUENCE {
    b1        IA5STRING(SIZE(0..10)),
    b2        IA5STRING(SIZE(3)),
    b3        IA5STRING,
    b4        OCTET STRING,
    b5        BIT STRING(SIZE(4)),
    b6        BIT    STRING
}

b B ::= {
    b1    "ABC",
    b2    "ABC",
    b3    "ABC",
    b4    '01020304'H,
    b5    '0101'B,
    b6    '0101'B
}

b的COER编码过程如下:
1)b是B类型的参数,是一个序列(SEQUENCE),不存在扩展标记(...),不存在 OPTIONAL或者 DEFAULT标记的选项,所以不需要对前导项进行编码。
2)b1编码为0x03414243,0x03是长度表示3个八位,0x414243是具体内容(变长)。
3)b2编码为0x414242,定长为3个八位。
4)b3编码为0x03414243,0x03是长度表示3个八位,0x414243是具体内容(变长)。
5)b4编码为0x0401020304,0x04是长度表示4个八位,0x01020304是具体内容(变长)。
6)b5编码为0x50,定长为1个八位,实际长度为4位,后四位并未使用。7)b6编码为0x020450,0x02是长度表示2个八位,0x0450是具体内容,0x04表示未使用的位数,0x50是具体内容(变长)。
--0x0341424341424203414243040102030450020450

其他类型

C ::= CHOICE {
    c1    BOOLEAN,
    c2    SEQUENCE OF ENUMERATED { a, b, c, d, e}
}

c C ::= c2 : {b, c, d, e}

c的CORE编码过程如下:c的CORE编码过程如下:
1)c是C类型的参数,是一个选择(CHOICE),tag标记类型编码为'10'B,成分编码为1。
--0x81('10000001'B)
--'00' universal,'01' application,'10' context-specific,'11' private
2)c2是 SEQUENCE OF类型的参数,编码为0x0104,长度为1个八位,循环次数为4次。
3)b的编码为0x01。
4)c的编码为0x02。
5)d的编码为0x03。
6)e的编码为0x04。
--0x81010401020304

接下来,将介绍具体隐式证书COER编码实例


http://www.niftyadmin.cn/n/5691147.html

相关文章

华为仓颉语言入门(9):for-in表达式

for-in 表达式用于遍历序列,它会依次访问序列中的每个元素,直到遍历完成。它常用于处理列表、数组或其他集合类型,能够有效简化代码,减少重复劳动。其基本语法如下: for (循环变量 in 序列) {循环体 }在 for-in 表达式中,每次循环都会检查是否遍历了序列中的所有元素。如…

[python]Flask_Login

flask_login是flask框架中的一个拓展功能,用于更快捷的实现用户会话管理功能,主要处理登录,注销和长时间会话存储的功能处理。 目录 安装 使用 第一步,配置SECRET_KEY 第二步,创建LoginManager实例绑定app 第三步,用户类继承UserMixin …

新闻推荐系统:Spring Boot的可扩展性

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

黑马JavaWeb开发跟学(八)MySQL多表查询以及MyBatis基础

黑马JavaWeb开发跟学八.MySQL多表查询以及MyBatis基础 数据库开发-MySQL1. 多表查询1.1 概述1.1.1 数据准备1.1.2 介绍1.1.3 分类 1.2 内连接1.3 外连接1.4 子查询1.4.1 介绍1.4.2 标量子查询1.4.3 列子查询1.4.4 行子查询1.4.5 表子查询 1.5 案例 2. 事务2.1 介绍2.2 操作2.3 …

零样本提示ChatGPT

导包 from openai import OpenAI import json client OpenAI(base_url"https://api.chatanywhere.tech/v1" )2.设置提示,提示最好放在3个引号内或3个#号内 prompt f""" 生成一个由三个虚构的订单信息所组成的列表,以JSON格…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候,需要绘制场景网格的功能,于是就用到了UnityEngine.GL这个图形库来绘制,然后我发现绘制的网格线是渲染在UI之后的,也就是说绘制出来的图形会遮盖在UI上面,也就导致一旦这些…

前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串

这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型(基础类型)合成类型(复合类型) 运算…

Linux环境基础开发工具使用(2)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. Li…