当前位置: 首页 > news >正文

[密码学实战]深入解析ASN.1和DER编码:以数字签名值为例

[密码学实战]深入解析ASN.1和DER编码:以数字签名值为例

1. 引言:ASN.1和DER在密码学中的重要性

在当今的网络安全体系中,ASN.1(Abstract Syntax Notation One)DER(Distinguished Encoding Rules) 扮演着至关重要的角色。它们是数字证书(X.509)、数字签名(如ECDSA)和许多网络协议(如TLS、SNMP)的基础编码标准。理解这些编码规则对于密码学工程师和安全开发人员至关重要。

2. ASN.1:抽象语法表示法

2.1 基本概念

  • 定义:ASN.1是一种描述数据结构的国际标准(ISO/IEC 8824/5)
  • 核心特性
    • 平台无关性:独立于编程语言和硬件平台
    • 自描述性:通过TLV(类型-长度-值)结构描述数据
    • 灵活性:支持复杂数据结构的定义

2.2 常见ASN.1类型

类型标签值描述示例
INTEGER0x02整数值5, -10, 0x1A3F
SEQUENCE0x30有序集合数字签名结构
BIT STRING0x03比特序列公钥数据
OBJECT IDENTIFIER0x06对象标识符算法标识
UTCTime0x17UTC时间“220504120000Z”

3. DER:确定性编码规则

3.1 DER的核心原则

DER是ASN.1的二进制编码规则之一,专为需要确定性编码的场景设计:

  1. 唯一性规则:相同的数据结构总是生成相同的字节序列
  2. 最小长度原则
    • 长度字段使用最小字节数表示
    • 整数使用最小字节表示(无前导零)
  3. 显式编码
    • 所有字段必须显式编码
    • 使用明确的结构标签

3.2 关键编码规则详解

3.2.1 整数编码规则
整数类型标签: 0x02
长度字段: N字节
值字段: 大端序表示的整数值

特殊要求

  • 整数值必须使用最小字节数表示
  • 当最高位为1时(可能被解释为负数),必须添加前导0x00字节
  • 禁止使用负零(-0)的表示
3.2.2 SEQUENCE编码规则
序列类型标签: 0x30
长度字段: 序列内所有元素的总长度
值字段: 序列内各元素的DER编码连接
3.2.3 长度字段编码规则
数据长度编码格式示例
< 128字节单字节 (0x00-0x7F)长度65 → 0x41
≥ 128字节多字节格式:
首字节 = 0x80 + 长度字节数
后续字节 = 实际长度的大端序
长度300 → 0x82012C

4. 实例分析:DER编码的数字签名值

4.1 原始签名数据

TLCP协议抓包真实数据:

在这里插入图片描述

3045022100ba06986227a389e1977a929dbd4c3e2d3f03e980d33a86789d2b9527ce91a92a022023c66381345af9ecd711473523ba578b5b85843785b9ab9e6cbda44656984f68

4.2 结构分解与解析

4.2.1 整体结构 (TLV)
30 45 → SEQUENCE类型,长度69字节
4.2.2 内部结构解析
(1) 第一个整数 r
02 → INTEGER标签
21 → 长度33字节
00ba06986227a389e1977a929dbd4c3e2d3f03e980d33a86789d2b9527ce91a92a → 值

补零分析

  • 首字节 0xba 二进制:10111010(最高位为1)
  • DER要求:当最高位为1时添加前导0x00防止负数解释
  • 实际值:0xba069862...a92a(256位大整数)
(2) 第二个整数 s
02 → INTEGER标签
20 → 长度32字节
23c66381345af9ecd711473523ba578b5b85843785b9ab9e6cbda44656984f68 → 值

无补零分析

  • 首字节 0x23 二进制:00100011(最高位为0)
  • 符合DER最小字节表示要求

4.3 结构可视化

30 45                              → SEQUENCE (69 bytes)
│
├─ 02 21                           → INTEGER (33 bytes)
│   00ba06986227a389e1977a929dbd4c3e2d3f03e980d33a86789d2b9527ce91a92a
│     ^^ (补零保证正数)
│
└─ 02 20                           → INTEGER (32 bytes)23c66381345af9ecd711473523ba578b5b85843785b9ab9e6cbda44656984f68

代码解析:

在这里插入图片描述

4.4 签名值提取

# Python提取r和s值
signature_hex = "3045022100ba069862...84f68"  # 完整HEX字符串# 提取r值(跳过前导00)
r_start = 8  # 30 45 02 21 00 后的位置
r_hex = signature_hex[r_start:r_start+64]# 提取s值
s_start = r_start + 64 + 4  # r的64字符 + 02 20
s_hex = signature_hex[s_start:s_start+64]print(f"r = 0x{r_hex}")
print(f"s = 0x{s_hex}")

输出结果

r = 0xba06986227a389e1977a929dbd4c3e2d3f03e980d33a86789d2b9527ce91a92a
s = 0x23c66381345af9ecd711473523ba578b5b85843785b9ab9e6cbda44656984f68

5. DER规则验证

5.1 唯一性验证

DER的确定性特性确保相同的签名数据每次编码结果相同,这对数字签名验证至关重要。

5.2 长度编码验证

  • 总长度69(0x45) < 128 → 使用单字节长度表示
  • 整数r长度33(0x21)→ 单字节表示
  • 整数s长度32(0x20)→ 单字节表示

5.3 整数编码验证

字段首字节最高位补零符合规范
r0xBA1
s0x230

6. 实际应用场景

6.1 数字证书(X.509)

X.509证书使用DER编码存储以下信息:

  • 证书版本和序列号
  • 公钥信息
  • 颁发者和有效期
  • 证书签名

6.2 数字签名(ECDSA/RSA)

签名数据
哈希处理
私钥签名
DER编码
传输/存储
DER解码
公钥验证

6.3 区块链应用

比特币和以太坊等区块链系统使用DER编码的ECDSA签名:

  • 比特币交易签名:DER编码的签名值作为脚本的一部分
  • 以太坊:使用RLP编码封装DER签名

7. 总结与最佳实践

7.1 核心要点总结

  1. ASN.1 是数据描述标准,DER 是其二进制编码规则
  2. DER通过严格规则确保编码唯一性:
    • 最小长度表示
    • 整数正数表示(必要时补零)
    • 显式结构标签
  3. 数字签名中,r和s值作为整数序列存储
  4. 边界情况处理至关重要(长度、整数符号)

7.2 开发实践建议

# Python中使用asn1crypto库处理DER
from asn1crypto import core# DER解码示例
der_data = bytes.fromhex("3045...f68")
signature = core.parse(der_data)# 获取r和s值
r_value = signature[0].native
s_value = signature[1].native# DER编码验证
reencoded = signature.dump()
assert reencoded == der_data, "DER编码不一致!"

推荐工具

  • ASN.1 JavaScript解码器:https://lapo.it/asn1js/
  • Python库:asn1crypto, pyasn1

理解ASN.1和DER编码不仅是密码学的基础,更是构建安全系统的关键技能。通过本文的实例分析和规则解读,希望能帮助开发者更深入地掌握这一核心技术。

如果本教程帮助您解决了问题,请点赞❤️收藏⭐支持!欢迎在评论区留言交流技术细节

http://www.lqws.cn/news/594631.html

相关文章:

  • 用openCV实现基础的人脸检测与情绪识别
  • 华为交换机堆叠与集群技术深度解析附带脚本
  • Sketch v2025「Athens」全新发布,3大更新重塑UI/UX设计的关键逻辑
  • stm32 单片机主要优点有哪些?
  • SAP ABAP 中 AMDP 简介及实现方法
  • Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理
  • ES05 - 集群的运维和安全
  • 玄机——第一章应急响应-Linux日志分析
  • AILiquid线上AMA首秀,全链AI驱动的去中心化合约平台引发关注
  • 【项目笔记】高并发内存池项目剖析(二)
  • npm list的使用方法详细介绍
  • 【开源项目】一款真正可修改视频MD5工具视频质量不损失
  • uniapp+vue写小程序页面,实现一张图片默认放大后,可以在容器内上下左右拖动查看
  • 前端第二节(Vue)
  • 【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案
  • anchor 智能合约案例3 之 journal
  • Docker进阶命令与参数——AI教你学Docker
  • 想做跑腿配送生意,怎么第三方平台订单对接?
  • MCU、LIN收发器、LIN总线、节点,它们之间是如何协作的?
  • SVN 分支管理(本文以Unity项目为例)
  • 以下是 Kafka 不同认证方式的配置示例,结合前面的单表设计方案,展示如何为每种认证方式填充配置表
  • 【Go-选项模式】
  • Spring Boot 2 多模块项目中配置文件的加载顺序
  • 2025年主流大厂Java后端面试题主题深度解析
  • 【深度学习新浪潮】人工智能在文物考古领域有哪些最新研究进展?
  • 基于开源AI大模型AI智能名片S2B2C商城小程序的流量转化与价值沉淀研究
  • 借助飞算AI新手小白快速入门Java实操记录
  • AbMole| H₂DCFDA(M9096;活性氧(ROS)探针)
  • C#基础(DllImport)
  • CppCon 2018 学习:Better C++ using Machine Learning on Large Projects