首页
/ OpenSC项目中EC和EDDSA公钥编码格式的技术解析

OpenSC项目中EC和EDDSA公钥编码格式的技术解析

2025-06-29 04:35:47作者:蔡丛锟

背景介绍

在OpenSC项目中,椭圆曲线(EC)和Edwards曲线数字签名算法(EDDSA)公钥的编码格式一直存在一些技术争议。本文将从密码学标准的角度,深入分析OpenSC项目中公钥编码的实现方式及其合理性。

两种编码格式对比

OpenSC项目在处理EC和EDDSA公钥时,主要采用两种不同的编码方式:

  1. SPKI格式:符合PKCS#15和X.509证书标准,采用ASN.1序列结构,包含曲线OID和以BIT STRING格式编码的公钥数据。这种格式被广泛认可为标准实现。

  2. OCTET STRING格式:直接将公钥数据编码为ASN.1 OCTET STRING。这种格式主要用于OpenSC内部处理。

标准规范分析

经过深入研究相关密码学标准,我们发现:

  1. ANSI X9.62标准明确指出:"椭圆曲线公钥(作为OCTET STRING的ECPoint)被映射到subjectPublicKey(一个BIT STRING)"。这表明在SubjectPublicKeyInfo结构中,ECPoint应作为BIT STRING呈现。

  2. PKCS#11规范要求CKA_EC_POINT属性应为"ANSI X9.62 ECPoint值的DER编码"。

  3. RFC 8410同样规定EdDSA和ECDH的公钥应使用BIT STRING格式。

OpenSC的实现演变

OpenSC对EC公钥的支持始于2010年,最初实现采用了OCTET STRING格式:

static struct sc_asn1_entry c_asn1_ec_pointQ[2] = {
       { "ecpointQ", SC_ASN1_OCTET_STRING, SC_ASN1_TAG_OCTET_STRING, SC_ASN1_ALLOC, NULL, NULL },
       { NULL, 0, 0, 0, NULL, NULL }
};

这种实现方式实际上符合ANSI X9.62对ECPoint的定义,即当不作为SubjectPublicKeyInfo使用时,ECPoint确实应表示为OCTET STRING。

PKCS#15标准的解读

PKCS#15 v1.1标准定义了ECPublicKeyChoice结构:

ECPublicKeyChoice ::= CHOICE {
raw ECPoint,
spki SubjectPublicKeyInfo,
...
}

这表明智能卡上可以存储两种格式的公钥:原始的ECPoint或完整的SubjectPublicKeyInfo。OpenSC对这两种格式的支持都是合理的。

PKCS#11属性的考量

在PKCS#11规范中:

  1. CKO_PUBLIC_KEY对象不包含CKA_VALUE属性,但在v2.40和3.0版本中增加了CKA_PUBLIC_KEY_INFO属性。

  2. OpenSC目前实现了CKA_VALUE和CKA_SPKI(作为供应商特定属性),未来可以增加对CKA_PUBLIC_KEY_INFO的支持。

实际应用示例

以YubiKey使用brainpoolP256r1曲线为例,当前输出显示:

EC_POINT: 0441042853adc20c3fb426b0b85483baa870a6f0bcdbb3e17ead4e18552614910ada25118d1ca82b0f44c15b90ee19950b182749a395a2940985ee6d3358a5ea43b434

这里的'04'标签表示OCTET STRING,后跟未压缩格式的EC公钥数据(04||x||y),这种表示方式在非SubjectPublicKeyInfo场景下是正确的。

结论

经过深入分析密码学标准和OpenSC实现,我们得出以下结论:

  1. OpenSC当前对EC和EDDSA公钥的两种编码方式都是正确的,分别适用于不同场景。

  2. 在SubjectPublicKeyInfo结构中,公钥必须使用BIT STRING格式。

  3. 在原始ECPoint表示和其他内部使用场景中,OCTET STRING格式同样符合标准。

因此,OpenSC现有的实现方式不需要修改,但可以进一步完善对PKCS#11新属性的支持,以提升兼容性。

登录后查看全文

项目优选

收起
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
295
957
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
493
393
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
111
196
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
59
140
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
356
321
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
51
14
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
97
251
ArkAnalyzer-HapRayArkAnalyzer-HapRay
ArkAnalyzer-HapRay 是一款专门为OpenHarmony应用性能分析设计的工具。它能够提供应用程序性能的深度洞察,帮助开发者优化应用,以提升用户体验。
Python
18
6
arkanalyzerarkanalyzer
方舟分析器:面向ArkTS语言的静态程序分析框架
TypeScript
33
38
CangjieMagicCangjieMagic
基于仓颉编程语言构建的 LLM Agent 开发框架,其主要特点包括:Agent DSL、支持 MCP 协议,支持模块化调用,支持任务智能规划。
Cangjie
579
41