【IoT】加密与安全:非对称加密算法 ECC 公私钥 DER 编码示例解析

本文主要是介绍【IoT】加密与安全:非对称加密算法 ECC 公私钥 DER 编码示例解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

加密算法的公私钥一般使用 ASN.1 标准的 DER 编码格式,本文先介绍 ASN.1( ASN.1 基础) 相关的基础知识,最后给出 ECC 公钥 DER 格式的示例便于更好理解 DER 编码。

1、ASN.1 简介

ASN.1( Abstract Syntax Notation One ) 是一种接口描述语言,提供了一种平台无关的描述数据结构的方式。

ASN.1 是 ITU-T、ISO、以及 IEC 的标准,广泛应用于电信和计算机网络领域,尤其是密码学领域。

ASN.1 可以通过 schema 来定义数据结构,提供跨平台的数据序列化和反序列化能力。有大量的 RFC 文档使用 ASN.1 定义协议、数据格式等。比如 https 所使用的 X.509 证书结构,就是使用 ASN.1 定义的。

ASN.1定义了若干基础的数据类型和结构类型:

我们可以使用这些基础类型来描述我们自己的数据结构:

 FooQuestion ::= SEQUENCE {trackingNumber INTEGER,question       IA5String
}

如上定义了一个名为 FooQuestion 的数据结构。它是一个 SEQUENCE 结构,包含了一个 INTEGER 类型,一个 IA5String
类型。

具体的 FooQuestion 可以描述为:

myQuestion FooQuestion ::= {trackingNumber     5,question           "Anybody there?"
}

用 ASN.1 定义的数据结构实例,可以序列化为二进制的 BER、文本类型的 JSON、XML 等。

1.1、Object Identifier 浅析

Object Identifier (OID) 是一项由ITU和ISO/IEC制定的标准,用来唯一标识对象、概念,或者其它任何具有全球唯一特性的东西。

一个OID表现为用.分隔的一串数字,比如椭圆曲线secp256r1的OID是这样:

1.2.840.10045.3.1.7

其每个数字的含义如下:

iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7

OID是全局统一分配的,全部的OID可以看做一棵多叉树,每一个有效的OID表现为树上的一个节点。当前所有的OID可以在这里找到。

OID是ASN.1的基本类型。

1.2、BER & DER 浅析

Basic Encoding Rules (BER) 是一种自描述的ASN.1数据结构的二进制编码格式。每一个编码后的BER数据依次由数据类型标识(Type identifier),长度描述(Length description), 实际数据(actual Value)排列而成,即BER是一种二进制TLV编码。TLV编码的一个好处,是数据的解析者不需要读取完整的数据,仅从一个不完整的数据流就可以开始解析。

Distinguished Encoding Rules (DER)是BER的子集,主要是消除了BER的一些不确定性的编码规则,比如在BER中Boolean类型true的value字节,可以为任何小于255大于0的整数,而在DER中,value字节只能为255。DER的这种确定性,保证了一个ASN.1数据结构,在编码为为DER后,只会有一种正确的结果。这使得DER更适合用在数字签名领域,比如X.509中广泛使用了DER。

关于各种ASN.1数据类型是如何被编码为DER,可以在这里找到详尽的解释。

如果有DER数据需要解析查看内容,这里有一个很方便的在线工具。

用DER来编码ASN.1小节中自定义的myQuestion如下:

0x30 0x13 0x02 0x01 0x05 0x16 0x0e 0x41 0x6e 0x79 0x62 0x6f 064 0x79 0x20 0x74 0x68 0x65 0x72 0x65 0x3f
---  ---  ---  ---  ---  ---  ---  --------------------------------------------------------------------^    ^    ^    ^    ^    ^    ^                                   ^|    |    |    |    |    |    |                                   ||    |    | INTEGER | IA5STRING                                   ||    |    | LEN=1   | TAG     |                                   ||    |    |         |         |                                   ||    | INTEGER   INTEGER   IA5STRING                          IA5STRING|    | TAG       VALUE(5)  LEN=14                             VALUE("Anybody there?")|    ||    |  ----------------------------------------------------------------------------------------------|    |                                              ^|  SEQUENCE LEN=19                                  ||                                                   |
SEQUENCE TAG                                  SEQUENCE VALUE

1.3、PEM 浅析

DER格式是ASN.1数据的二进制编码,计算机处理方便,但不利于人类处理,比如不方便直接在邮件正文中粘贴发送。PEM是DER格式的BASE64编码。除此之外,PEM在DER的BASE64前后各增加了一行,用来标识数据内容。示例如下:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMYfnvWtC8Id5bPKae5yXSxQTt
+Zpul6AnnZWfI2TtIarvjHBFUtXRo96y7hoL4VWOPKGCsRqMFDkrbeUjRrx8iL91
4/srnyf6sh9c8Zk04xEOpK1ypvBz+Ks4uZObtjnnitf0NBGdjMKxveTq+VE7BWUI
yQjtQ8mbDOsiLLvh7wIDAQAB
-----END PUBLIC KEY-----

1.4、X.509 浅析

X.509是一项描述公钥证书结构的标准,广泛使用在HTTPS协议中,定义在RFC 3280

X.509使用ASN.1来描述公钥证书的结构,通常编码为DER格式,也可以进一步BASE64编码为可打印的PEM格式。V3版本的X.509结构如下:

    Certificate  ::=  SEQUENCE  {tbsCertificate       TBSCertificate,signatureAlgorithm   AlgorithmIdentifier,signatureValue       BIT STRING  }TBSCertificate  ::=  SEQUENCE  {version         [0]  EXPLICIT Version DEFAULT v1,serialNumber         CertificateSerialNumber,signature            AlgorithmIdentifier,issuer               Name,validity             Validity,subject              Name,subjectPublicKeyInfo SubjectPublicKeyInfo,issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,-- If present, version MUST be v2 or v3subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,-- If present, version MUST be v2 or v3extensions      [3]  EXPLICIT Extensions OPTIONAL-- If present, version MUST be v3}Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }CertificateSerialNumber  ::=  INTEGERValidity ::= SEQUENCE {notBefore      Time,notAfter       Time }Time ::= CHOICE {utcTime        UTCTime,generalTime    GeneralizedTime }UniqueIdentifier  ::=  BIT STRINGSubjectPublicKeyInfo  ::=  SEQUENCE  {algorithm            AlgorithmIdentifier,subjectPublicKey     BIT STRING  }Extensions  ::=  SEQUENCE SIZE (1..MAX) OF ExtensionExtension  ::=  SEQUENCE  {extnID      OBJECT IDENTIFIER,critical    BOOLEAN DEFAULT FALSE,extnValue   OCTET STRING  }

1.5、SubjectPublicKeyInfo 介绍

如上一节所示,SubjectPublicKeyInfo是公钥证书格式X.509的组成部分。SubjectPublicKeyInfo结构使用ASN.1描述,其中使用了椭圆曲线公私钥加密算法的SubjectPublicKeyInfo结构定义在RFC 5480

其结构如下:

   SubjectPublicKeyInfo  ::=  SEQUENCE  {algorithm            AlgorithmIdentifier,subjectPublicKey     BIT STRING}AlgorithmIdentifier  ::=  SEQUENCE  {algorithm   OBJECT IDENTIFIER,parameters  ANY DEFINED BY algorithm OPTIONAL}

可以看到AlgorithmIdentifier也是一个SEQUENCE,其parameters部分取决于algorithm的具体取值。

对不限制的ECC公钥使用算法的场景,algorithm取值:

1.2.840.10045.2.1即: iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1

在该种类场景下,parameters的定义如下:

    ECParameters ::= CHOICE {namedCurve         OBJECT IDENTIFIER}

即parameters指定了ECC公钥所使用的椭圆曲线。其可选的值有:

    secp192r1 OBJECT IDENTIFIER ::= {iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 }sect163k1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 1 }sect163r2 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 15 }secp224r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 33 }sect233k1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 26 }sect233r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 27 }secp256r1 OBJECT IDENTIFIER ::= {iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 }sect283k1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 16 }sect283r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 17 }secp384r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 34 }sect409k1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 36 }sect409r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 37 }secp521r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 35 }sect571k1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 38 }sect571r1 OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) certicom(132) curve(0) 39 }

algorithm确定后,再来看下subjectPublicKey,对ECC公钥来讲,subjectPublicKey就是ECPoint:

    ECPoint ::= OCTET STRING

是长度为65字节的OCTET STRING,其中第一个字节代表ECPoint是否经过压缩,如果为0x04,代表没有压缩。剩下的64个字节,前32个字节,表示ECPoint的X坐标,后32个字节表示ECPoint的Y坐标。

OCTET STRING类型的ECPoint在转换为BIT STRING类型的subjectPublicKey时,按照大端字节序转换。

2、ECC 公钥 DER 示例

我们以一个DER编码的ECC公钥为例,详细剖析一下X.509 ECC公钥的格式。公钥内容如下:

0x30 0x59 0x30 0x13 0x06 0x07 
0x2a 0x86 0x48 0xce 0x3d 0x02 
0x01 0x06 0x08 0x2a 0x86 0x48 
0xce 0x3d 0x03 0x01 0x07 0x03 
0x42 0x00 0x04 0x13 0x32 0x8e 
0x0c 0x11 0x8a 0x70 0x1a 0x9e 
0x18 0xa3 0xa9 0xa5 0x65 0xd8 
0x41 0x68 0xce 0x2f 0x5b 0x11 
0x94 0x57 0xec 0xe3 0x67 0x76 
0x4a 0x3f 0xb9 0xec 0xd1 0x15 
0xd0 0xf9 0x56 0x8b 0x15 0xe6 
0x06 0x2d 0x72 0xa9 0x45 0x56 
0x99 0xb0 0x9b 0xb5 0x30 0x90 
0x8d 0x2e 0x31 0x0e 0x95 0x68 
0xcc 0xcc 0x19 0x5c 0x65 0x53 
0xba

通过前面的介绍,我们已经知道这是一个ASN.1格式的SubjectPublicKeyInfo的DER编码,是一个TLV类型的二进制数据。现在我们逐层解析下:

0x30 (SEQUENCE TAG: SubjectPublicKeyInfo) 0x59 (SEQUENCE LEN=89)0x30 (SEQUENCE TAG: AlgorithmIdentifier) 0x13 (SEQUENCE LEN=19)0x06 (OID TAG: Algorithm) 0x07 (OID LEN=7)0x2a 0x86 0x48 0xce 0x3d 0x02 0x01 (OID VALUE="1.2.840.10045.2.1": ecPublicKey/Unrestricted Algorithm Identifier)0x06 (OID TAG: ECParameters:NamedCurve) 0x08 (OID LEN=8)0x2a 0x86 0x48 0xce 0x3d 0x03 0x01 0x07 (OID VALUE="1.2.840.10045.3.1.7": Secp256r1/prime256v1)0x03 (BIT STRING TAG: SubjectPublicKey:ECPoint) 0x42 (BIT STRING LEN=66) 0x00 (填充bit数量为0)0x04 (未压缩的ECPoint)0x13 0x32 0x8e 0x0c 0x11 0x8a 0x70 0x1a 0x9e 0x18 0xa3 0xa9 0xa5 0x65 0xd8 0x41 0x68 0xce 0x2f 0x5b 0x11 0x94 0x57 0xec 0xe3 0x67 0x76 0x4a 0x3f 0xb9 0xec 0xd1 (ECPoint:X)0x15 0xd0 0xf9 0x56 0x8b 0x15 0xe6 0x06 0x2d 0x72 0xa9 0x45 0x56 0x99 0xb0 0x9b 0xb5 0x30 0x90 0x8d 0x2e 0x31 0x0e 0x95 0x68 0xcc 0xcc 0x19 0x5c 0x65 0x53 0xba (ECPoint:Y)

 

 

refer:

https://www.cnblogs.com/xinzhao/p/8963724.html

https://blog.csdn.net/taolinke/article/details/6594431?_t=t

这篇关于【IoT】加密与安全:非对称加密算法 ECC 公私钥 DER 编码示例解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410695

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [