TPM 2.0 ECC算法敏捷性探讨

算法敏捷性 – 关于TPM 2.0 ECC功能的讨论

摘要

TPM 2.0 规范设计支持多种椭圆曲线密码学(ECC)原语,例如密钥交换、数字签名和直接匿名证明(DAA)。为了满足不同 TPM 用户可能偏好不同密码算法的需求,每种原语均可通过多种算法实现。此特性称为 Algorithm Agility。为了提高性能效率,多种算法共享少量的 TPM 命令。本文回顾了所有 TPM 2.0 的 ECC 功能,并讨论现有 TPM 命令是否可用于实现规范中尚未涵盖的新密码算法。我们证明了 ISO/IEC 18033‐2 中规定的四种非对称加密方案可以使用 TPM 2.0 芯片实现,同时也表明在某些 ECDSA 变体上,TPM 2.0 的算法敏捷性覆盖范围有限。算法敏捷性的安全分析是一个挑战,本文未对此进行回应。然而,我们相信本文将有助于未来的研究人员以比以往更全面的方法分析 TPM 2.0。

关键词 :算法敏捷性 · Elliptic曲线密码学 · Trusted平台模块

1 引言

可信平台模块(TPM)是一种防篡改密码处理器的国际标准。TPM的技术规范由一个名为可信计算组织(TCG)的计算机行业标准机构制定。首个广泛使用的TPM规范是2003年发布的TPM 1.0版本。2[29],国际标准化组织(ISO)和国际电工委员会(IEC)于 2009[1]将其标准化为ISO/IEC 11889。

TPM 1.2 规范仅支持少量密码算法:RSA 加密和数字签名、SHA‐1 哈希函数、 HMAC

c©斯普林格国际出版公司AG 2016 L. 陈 等 (编): SSR 2016, LNCS 10074, 第141–159页, 2016年. DOI: 10.1007/978‐3‐319‐49100‐4 6

本文档由 funstory.ai 的开源 PDF 翻译库 BabelDOC v0.5.10 (http://yadt.io) 翻译,本仓库正在积极的建设当中,欢迎 star 和关注。

142 L. 陈和R.尤里安

基于RSA问题的消息认证码和直接匿名证明(DAA)。这种固定的算法覆盖范围无法满足全球TPM用户的需求。除了SHA‐1因攻击问题已不再适用于数字签名这一明显原因外,[31],不同国家和地区的人们可能偏爱不同的密码算法,尤其是椭圆曲线密码学。这要求可信计算组织修订TPM规范。

作为回应,可信计算组织(TCG)持续修订TPM规范,其中最重要的一步是从 TPM 1.2升级到TPM 2.0。最新的TPM 2.0版本是于 2014[30]年10月发布的《可信平台模块库规范版本01.16》。国际标准化组织/国际电工委员会(ISO/IEC)于 2015[2]年12月将该规范标准化为ISO/IEC 11889,同时此前的2009版[1]被废止。

在TPM 1.2的众多重要修改中,从本文作者的角度来看,最吸引人的变化是TPM2.0支持算法敏捷性,这意味着每个密码学原语都可以被多种密码算法使用。这是通过使用TCG算法注册表[28]来实现的。

尽管算法敏捷性是一个广受认可的特性,但在TPM 2.0系列的开发中,性能效率仍然是最重要的需求之一。为了在算法敏捷性与高性能之间实现平衡, TPM 2.0规范允许多个算法共享一组TPM命令。

TPM 1.2 新增的密码学功能包括多种椭圆曲线密码学(ECC)原语,例如基于椭圆曲线(EC)的数字签名、密钥交换和直接匿名证明(DAA)。本文重点讨论 TPM 2.0 ECC 功能的算法敏捷性。我们的目标是做出以下贡献:
1. 找出现有的TPM 2.0命令是否可用于实现当前规范[2,30]中尚未涵盖的新密码算法。我们证明了ISO/IEC 18033‐2[4]中规定的四种非对称加密方案可以使用 TPM 2.0芯片实现。我们还表明,TPM 2.0的算法敏捷性覆盖范围有限。
2. 展示在以可被多种不同标准使用的方式实现算法时所面临的一些障碍。
3. 提供对TPM 2.0中ECC功能的简明描述,使其比规范[2,30]更易于密码学研究人员理解。

在文献中,有许多论文旨在分析可信平台模块(TPM)的安全特性。这些研究均聚焦于特定的密码算法或功能;例如,分析隐私证书颁发机构解决方案 [15,19] 和直接匿名证明(DAA)[10,13,33]。据我们所知,目前尚不存在对多项 TPM 功能(如算法敏捷性)进行全面安全分析的研究。这是一个巨大的挑战。我们注意到,尚未出现此类研究的一个原因是 TPM 规范对于密码学研究人员而言并不友好,其证据就是该规范 [2,30] 超过 1500 页。尽管本文并不旨在完全解决这一挑战,但我们相信

算法敏捷性 – 关于TPM2.0椭圆曲线密码学功能的讨论 143

本文的内容将帮助未来的密码学研究人员分析员 TPM 2.0 采用比迄今为止更为全面的方法。本文的其余部分安排如下。在下一节中,我们将回顾现有的TPM 2.0 ECC功能,包括TPM密钥处理方法和命令的简要概述,以及与TPM ECC相关的命令。在第3节中,我们列出TPM 2.0 规范中已涉及的基于椭圆曲线的密码算法和协议。在第4节中,我们将讨论若干可以利用现有TPM 2.0 ECC功能实现的非对称加密算法,尽管这些算法尚未在规范中提及。在本节中,我们还通过ECDSA签名算法的变体展示TPM算法敏捷性的局限性。在第5节中,以基于椭圆曲线的Schnorr数字签名方案为例,我们将进一步讨论兼容性方面的一些问题。第6节将分享我们关于TPM性能的考虑。我们将在第7节以一个开放性问题结束全文:如何定义并证明TPM 2.0算法敏捷性属性的安全概念。

TPM2.0 ECC功能概述

本节概述了TPM 2.0规范[2,30]中规定的椭圆曲线密码学(ECC)功能。由于可信计算组TPM 2.0规范[30]仍在开发中,本节所使用的信息基于国际标准化组织/国际电工委员会发布的TPM库版本 2015[2]。我们介绍一组用于实现 TPM 2.0 ECC功能的主要TPM 2.0命令。随后,列出规范中提到的所有基于椭圆曲线的密码算法。

2.1 可信平台模块密钥介绍

为了描述TPM 2.0环境中的ECC密钥,我们使用表1中所示的符号表示。

TPM 密钥结构。 在 TPM 2.0 环境中,TPM密钥采用密钥层次结构进行组织。由于需要限制 TPM 资源,密钥通常存储在外部。除根密钥外,每个密钥都关联一个父密钥 parentK,而最高层的父密钥是根密钥。

设一个ECC密钥表示为tk,其私钥部分tsk和公钥部分tpk。TPM所知晓的 ECC密钥的一些系统参数包括曲线的系数、曲线的域模数、曲线上群元素的阶以及群的生成元。为简便起见,我们用tpk来涵盖所有这些参数。每个密钥tk都关联有一个密钥名称(表示为tk.name)、一个密钥块(表示为tk.blob)和一个密钥句柄(表示为tk.handle),它们具有以下含义。

144 L. 陈and R.尤里安 表1. 本文使用的符号表示

符号表示 描述
tk 由可信平台模块创建的ECC密钥
tk的公钥/私钥部分 由TPM创建的ECC密钥的公钥/私钥部分
用于引入另一个密钥的
密钥
用于引入另一个密钥的密钥
k.name 用于从外部标识密钥的密钥名称 k
k.blob 密钥 k 的密钥块,由其 parentK 封装
k.handle 用于可信平台模块内部通过句柄 k 标识密钥
kdf(s) 使用 s作为种子的密钥派生函数
mac k(m) 使用密钥 k 计算的 m 的消息认证码
(m)k 在对称密钥 k 下对 m 进行加密
x‖y x和 y的连接
Gp 一个阶为 p 的椭圆曲线群
G Gp的一个生成元

– 密钥名称:tk.name 是 tpk 和密钥属性的消息摘要。它通常用于验证密钥的完整性。

– 密钥块:每个存储在可信平台模块外部的可信平台模块密钥均以密钥块格式存在;tk.blob 包含以下信息:在父密钥parentK下加密的tsk、tpk 以及一个完整性标签。该标签使可信平台模块能够验证密钥的完整性和密钥的真实性,并通过使用消息认证码(mac)实现。加密密钥 sk 和 MAC 密钥 mk 均通过密钥派生函数(kdf)从 parentK 派生而来。以下是 tk.blob 的简要描述:
(sk, mk):= kdf(parentK), tk.blob:=(tsk)sk‖tpk‖macmk((tsk)sk‖tpk.name).

–密钥句柄:如果 tk 与多个命令相关联,则这些命令之间的连接通过唯一标识该密钥的 tk.handle 表示。tk.handle 在 tk 被加载到可信平台模块(TPM) 时由 TPM 分配。此类密钥句柄是一个 4字节(字)值。第一个字节指定句柄类型,剩余三个字节唯一地引用该密钥。在加载命令之后,当 tk 随后被用于另一个命令(或多个命令)时,每个命令将把该句柄作为输入。如果一个命令涉及多个密钥,则这些密钥的所有句柄都将作为该命令的输入。

每个ECC密钥的使用由三个密钥基本属性分类为受限、签名和解密。表2显示了有效的组合。

用于签名属性允许密钥执行签名操作,例如该密钥可用于TPM2 Sign() 命令。

算法敏捷性 – 关于TPM2.0 ECC功能的讨论 145 表 2。密钥基本属性

Sign Decrypt Restricted Description
0 0 0 无密钥,用户定义的数据块
0 0 1 不允许
0 1 0 一个解密密钥,但可能不是用于引入另一个密钥的密钥
0 1 1 可能是用于引入另一个密钥的密钥
1 0 0 用于对外部数据进行签名的密钥
1 0 1 仅对可信平台模块生成的数据进行签名的密钥
1 1 0 一个通用密钥
1 1 1 不支持

用于解密属性允许密钥执行解密操作,例如该密钥可用于TPM2 ECDH ZGen() 命令。

受限属性需要进一步解释。我们首先说明受限签名密钥。可信平台模块可用于对由外部提供的消息进行签名,或对内部生成的数据进行签名。例如, TPM2 Quote()命令会对某些平台配置寄存器的值进行签名,而TPM2 Certify()命令会对一个TPM生成的密钥进行签名。验证者必须能够确认这些签名确实是由相关命令对可信平台模块内部数据执行的。为此,可信平台模块会在签名的消息头部添加一个称为TPM生成的值的特殊标签字。该标签可向验证者证明该签名属于可信平台模块创建的数据。如果签名密钥具有受限属性,则仅当外部提供的消息不以TPM生成的值标签开头时,可信平台模块才会使用 TPM2 Sign()命令对其进行签名。此机制可防止TPM2 Sign()命令被滥用以伪造平台认证。

受限解密属性主要用于父密钥以保护密钥块。此处必须确保只有可信平台模块才能解密该密钥块。受限属性可防止该密钥用于通用解密命令(例如 TPM2 ECDH ZGen())。如果该密钥不是受限的,攻击者便可简单地使用 TPM2 ECDH ZGen()命令来解密密钥块。

除了基本属性外,还有其他密钥属性。我们在此不详细讨论,仅提及最重要的几个。
– userWithAuth 和 adminWithPolicy:它们控制密钥的授权。
– fixedTPM 和 fixedParent:它们控制该密钥是否可以在同一可信平台模块或另一个可信平台模块中的另一个父密钥下被复制。

2.2 TPM 2.0 密钥处理命令

所有可信平台模块功能均通过使用一组TPM命令来实现。大多数TPM命令具有多种选项,涉及不同类型的密钥和

146 L. 陈和R.尤里安

应用程序。为简便起见,我们仅解释与本文后续部分将讨论的可信平台模块椭圆曲线密码学功能实现相关的选项。出于同样原因,如果某些输入和输出信息与我们的目的无关,我们也可能予以省略。

生成密钥: TPM2 Create()。 可通过此命令生成一个椭圆曲线密码学密钥tk。该命令以已加载到可信平台模块中的父密钥(例如parentK)的句柄以及关于曲线、算法标识符等公有参数作为输入,创建一个新的ECC密钥对tk= (tpk,tsk),并输出一个经过封装的密钥块tk。blob如前所述。

在椭圆曲线密码学功能的背景下,可信平台模块为响应此命令,执行以下步骤:
1. 可信平台模块选择一个随机数 x ← Zp并计算 Y=[x]G,其中 p和 G是公有参数的一部分,这些参数依赖于下一小节将讨论的椭圆曲线密码学算法。2. 可信平台模块设置tpk := Y,tsk := x,以及tk :=(tpk,tsk)。3. 可信平台模块使用父密钥封装tk,并输出密钥数据块tk.blob。

此命令的一个变体是TPM2 主密钥创建(),其中私钥tsk通过密钥派生函数从可信平台模块的主种子派生而来(kdf)。主种子是存储在可信平台模块内部的一个密钥。因此,密钥tk是密钥层次结构中的根密钥。同一个主种子可用于创建多个根密钥。为了使每个生成的密钥具有唯一性,应使用某些索引值。

主密钥将在内部用作保护普通密钥密钥层次结构的根密钥。它们通常不会用于加密服务,因此我们在本文其余部分中忽略它们。

将密钥加载到可信平台模块: TPM2 加载()。 当在TPM2 创建()中创建tk时,它并未存储在可信平台模块内部。为了使用tk,必须通过命令TPM2 加载()将其加载到可信平台模块中。该命令输入一个父密钥句柄和一个密钥块tk.blob。可信平台模块通过检查密钥块在父密钥下的验证来确认密钥完整性,还可选择性地验证用户授权和属性一致性。如果所有验证均成功,可信平台模块将输出该密钥的句柄tk.handle和名称tk.name。在调用TPM2 加载()之后,tk现在已存储在可信平台模块内部,可用于后续操作。

将外部密钥加载到可信平台模块:TPM2 外部密钥加载()。一个不属于可信平台模块密钥层次结构的外部密钥也可以被加载到可信平台模块中。这通常仅为公钥。例如,如果目的是进行签名验证,则公有验证密钥将通过此命令加载到可信平台模块中。

算法敏捷性 – 关于TPM2.0椭圆曲线密码学功能的讨论 147

2.3 TPM 2.0 ECC命令

提交一个临时密钥用于签名:TPM2 Commit()。几种基于椭圆曲线的签名方案通过两个阶段实现:提交和签名。提交过程通过调用命令TPM2 Commit() 来完成。该命令输入一个签名密钥tk的密钥句柄、一个在 P1上的点 Gp、一个字符串 sˆ以及一个整数 ˆy,其中 sˆ和 ˆy用于构造另一个在 P2上的点 Gp,具体细节见下文。可信平台模块向主机输出三个点 R1、 R2、 K2以及一个计数器ctr,其中ctr用于标识此命令生成的随机值 r。为响应此命令,可信平台模块执行以下步骤:
1. 可信平台模块计算ˆx:= H(sˆ),其中 H为抗碰撞哈希函数,并设置 P2:=(ˆx,ˆ y)。2. 可信平台模块验证 P1和 P2是 Gp中的元素。3. 可信平台模块选择一个随机整数 r ← Zp。4. 可信平台模块计算 R1:=[r]P1, R2:=[r]P2,以及 K2: =[私钥tsk]P2。5. 可信平台模块输出 R1, R2, K2和ctr,同时在内部保留 r。

如果 sˆ 和 ˆy 为空,则不计算 R2 和 K2 。如果 P1、sˆ 和 ˆy 均为空,则计算 R1=[r]G,其中 G 是曲线参数中的长期基点,并且在创建 tk 时被使用。

签名: TPM2 Sign()。 该命令可用作单阶段签名操作,或作为两阶段签名协议的第二阶段。它以签名密钥tk的句柄、消息摘要 ch以及可选的计数器值ctr作为输入,并输出对该消息的签名 σ。仅当在执行了提交命令TPM2 Commit()后调用sign命令时,才需要提供计数器值ctr。可以使用标准的数字签名算法,例如RSA、ECDSA或ECSchnorr签名。如果使用传统签名方案,则无需调用提交命令。在两阶段签名协议的上下文中,可信平台模块通过执行以下步骤来响应此命令:
1. 可信平台模块根据ctr值从提交命令中检索 r。2. 可信平台模块计算 s:= r+ c·tsk mod p并删除 r。3. 可信平台模块输出 s。

注意:最近席等人[33]和Camenisch等人[13]报告了[16],的安全证明中存在的一个问题,该问题要求对[2]中的方案进行修改,即添加随机数 nt。还请注意,随机数 nt已包含在ISO/IEC 20008‐2[6],所规定的另一版本EC‐DAA方案中,因此该问题无需对ISO/IEC 20008‐2进行此类修改。当然,此修改也影响到其他依赖ECDAA功能的协议。以下是修改后的签名算法。

148 L. 陈和R.尤里安
1. 可信平台模块生成了一个随机数 nt → Zp。2. 可信平台模块计算 c: = H(ch, nt)。3. 可信平台模块根据计数器ctr值从commit命令中检索出 r。4. 可信平台模块计算 s:= r+ c·私钥tsk 模 p并删除 r。5. 可信平台模块输出 σ=(nt, s)。

TPM 2.0 规范还包含对可信平台模块内部存储的数据执行签名的命令。例如,TPM2Quote() 用于对平台配置寄存器进行签名,而TPM2 Certify() 将对另一个可信平台模块内部存储的密钥进行签名。我们不会详细讨论这些命令。

计算临时密钥: TPM2ECDH KeyGen()。 该命令以已加载密钥的公有部分作为输入,其中包含曲线上的一个椭圆曲线点 P,从ECC私钥空间中均匀随机选择一个元素 d,计算 Q:=[d]P,并输出 P和 Q。可信平台模块不会记录或输出值 d。由于此操作可由软件执行,因此使用该已加载密钥无需授权,且该密钥可以是签名或加密密钥。

计算静态DH密钥:TPM2ECDH ZGen()。该命令输入一个已加载的包含私有部分 d及其对应公有参数的密钥,以及一个椭圆曲线点 P。可信平台模块首先验证P是否与公有参数匹配。如果验证通过,可信平台模块计算 Z:=[d]P,并输出 Z。由于此操作使用了ECC密钥的私有部分,因此需要对该密钥进行授权。该密钥的属性为受限属性CLEAR和解密属性SET。

密钥交换中的临时密钥提交:TPM2 EC Ephemeral()。该命令以椭圆曲线密码学密钥的公有参数(包含椭圆曲线点 G)作为输入,使用TPM2 Commit()中的计数器技术生成ECC密钥的临时私有部分 r,并计算公钥P:=[r]G。 P的值连同与 r相关联的计数器值一起返回给调用者。

计算DH密钥: TPM2 ZGen 2Phase()。该命令以方案选择器和由TPM2 EC Ephemeral()返回的计数器值以及相应的公有参数作为输入,重新创建 r并重新生成关联的公钥。之后,可信平台模块将作废 r值,以确保其不会再次使用。该命令可用于实现多种密钥交换协议,这些协议可能具有不同的操作。方案选择器用于告知可信平台模块应实现哪种密钥交换协议。

TPM 2.0 规范还包含 TPM2 ActivateCredential() 命令,该命令在内部使用椭圆曲线密码学解密算法。此命令不能用于通用数据的解密,因此我们不会深入探讨该命令的细节。

3 TPM 2.0中已知的椭圆曲线密码学使用案例

TPM 2.0 规范 [2]支持三种椭圆曲线密码学原语:传统数字签名、称为直接匿名证明的匿名数字签名,以及Diffie‐Hellman(DH)密钥交换。

3.1 传统数字签名

TPM 2.0 规范中提到了以下三种传统的数字签名算法 [2]。
1. ECDSA。该规范未对此算法的任何细节进行说明,仅将其引用至ISO/IEC 14888‐3[3]。该算法最初在NIST FIPS 186‐3[23]中描述。它也在许多其他规范中定义,例如德国联邦信息安全办公室(BSI)TR‐03111[12]。2. ECSchnorr。该规范规定了椭圆曲线Schnorr签名方案的一种实现,被指定为 TPM ALG_ECSCHNORR 方案。该方案包括椭圆曲线Schnorr签名操作和签名验证操作。TPM 2.0 规范中给出的椭圆曲线Schnorr签名方案的参考文献为 ISO/IEC 14888‐3[3]。3. SM2。该规范规定了SM2数字签名方案,这是一种基于椭圆曲线的中国国家标准签名方案,最初发布为中国国家标准[27]。该数字签名方案最近已被国际标准化组织/国际电工委员会(ISO/IEC)采纳,并正在加入ISO/IEC 14888‐3[3]修订版的过程中。

3.2 直接匿名证明(DAA)

TPM芯片的主要用途之一是向某个验证者证明平台配置的状态。这通常是通过在 TPM内部对平台配置寄存器的值进行签名来实现的。一个重要的隐私要求是两次证明之间不可链接。在直接匿名证明(DAA)出现之前,这一目标是通过使用隐私认证机构(privacy CA)实现的。其基本工作方式如下:每次进行证明时,TPM都会联系隐私认证机构,并请求生成一个新的密钥——“证明身份密钥”(AIK),以及相应的X.509证书。这种方式实现了隐私保护,因为验证者每次看到的都是不同的公钥。如果验证者收到两次证明,则无法判断它们来自两个不同的TPM还是同一个TPM。在这种情况下,从验证者的角度来看,这些证明是不可链接的。

这种方案的缺点是,每次认证都需要隐私CA的参与。此外,该CA能够关联来自同一TPM的两个签名,并找出哪个TPM是签名者。因此,TGC一直在寻找一种不需要隐私CA的解决方案。在TCG历史上,DAA是唯一一种为满足 TCG特殊隐私需求而设计的密码学原语。DAA是一种匿名数字签名。DAA协议通过随机化签名及相关证书来实现不可关联性。

150 L. 陈和R.尤里安

首个RSA DAA方案由Brickell、Camenisch 和 Chen [10]为TPM 1.2 规范 [29]提出。TPM 2.0 规范设计用于支持基于椭圆曲线(EC)的新一代 DAA协议。TPM 2.0 规范 [2]支持两种基于椭圆曲线上的配对的不同DAA协议。第一种[17]基于Camenisch‐Lysyanskaya (CL) 凭证 [14] ,第二种 [11]基于sDH 凭证 [9]。Chen 和 Li[16]的论文展示了这两种DAA协议如何与TPM 2.0 芯片结合使用。

3.3 具有属性的直接匿名证明 (DAA‐A)

Chen 和 Urian [18]最近提出了一种通过添加多个属性来扩展直接匿名证明的方法。该协议与U‐Prove协议相关,但相比U‐Prove协议具有显著优势:与 U‐Prove协议不同,DAA‐A 是多示证明可链接性的。DAA‐A 协议有两种变体,分别对应相应的 ECDAA 协议:
– 对应于CL ECDAA协议的CL DAA‐A协议。
– 对应于sDH ECDAA(又称 Epid)协议的sDH DAA‐A协议。

简而言之,DAA‐A协议的工作流程如下:每个属性值将被编码为一个ECC密钥的指数,该密钥通常存储在主机上,但为了更高的安全性,也可以存储在 TPM上。DAA‐A签发者定义了将在DAA‐A凭证中使用的一组属性。根据最小披露原则,TPM/主机应仅向验证者透露最少数量的属性。TPM/主机针对每一次单独的认证,决定向验证者公开哪些属性,对哪些属性进行隐藏。被公开的属性将在DAA‐A签名协议过程中由TPM/主机发送给验证者。而被隐藏属性的正确性则通过零知识证明向验证者证明。

属性可以存储在主机上或TPM上。托管在TPM上的属性作为传统的签名密钥进行存储。DAA‐A方案使用TPM2 Sign() 和 TPM2Commit() 命令,这些命令在ISO/IEC 11889[2],中规定为子协议,以协助生成DAA‐A签名(详见 [18])。

由于提议更改用于ECDAA的TPM2 签名() 命令(参见第2.3节), DAA‐A 与此命令的集成也必须相应修改。我们将其作为开放性问题保留,且在我们看来,该问题并不简单。

3.4 U‐Prove

微软的 U‐Prove 协议 [25] 是一种基于属性且由用户控制选择性披露的协议。Chen 和 Li 的论文 [16] 展示了如何将 U‐Prove 与 TPM 2.0 芯片集成。但 U‐Prove 协议具有

算法敏捷性 – 关于TPM2.0 ECC功能的讨论 15 1

严重的缺点是它不具备多示证明可链接性。原因是U‐Prove协议的认证令牌由类似Schnorr的签名进行签名,而签名值可用作关联句柄。为了实现不可链接性,U‐Prove令牌只能使用一次。

3.5 密钥交换

TPM 2.0 规范中提到了以下基于迪菲‐赫尔曼(DH)的椭圆曲线环境中的密钥交换方案[2]。有趣的是,TPM 2.0 规范将此技术称为“秘密共享”。但“秘密共享”通常被广泛用于指代另一种密码协议,其中多个实体各自持有一个共同秘密的一部分,若干实体可协作恢复该秘密。为避免混淆,本文中我们将此技术统称为“密钥交换”。
1. 单程DH。该规范指定了单程DH密钥交换方案,并引用自NIST SP800‐56A [26]。
2. 双程DH。该规范指定了双程DH密钥交换方案,同样源自 NIST SP800‐56A [26]。
3. ECMQV。该规范指定了双程DH密钥交换方案,即基于椭圆曲线的MQV[26]。
4. SM2密钥交换。该规范指定了来自SM2系列的双程DH密钥交换方案,即中国椭圆曲线密码学国家标准 [27]。

TPM2.0的新ECC用例

在本节中,我们将讨论密码协议如何与TPM 2.0结合使用,尽管这些内容尚未在规范中提及。首先,我们将说明可信平台模块可以很好地集成到非对称加密方案中。然后,通过讨论一些签名算法的变体,展示可信平台模块集成的局限性。

4.1 非对称加密

根据TPM 2.0规范[2,30],,椭圆曲线密码学(ECC)并不直接用于加密。众所周知,在ECC中,使用密钥交换功能从ECC密钥建立对称密钥,然后使用对称算法进行数据加密,这被称为混合加密,即密钥封装机制和数据封装机制( KEM‐DEM)。TPM 2.0规范未指定任何KEM‐DEM方案。在本节中,我们演示如何使用TPM 2.0在ISO/IEC 18033‐2[4]的ECC环境下实现基于ElGamal的 KEM方案。出于性能考虑(由于TPM芯片在数据加密/解密方面相比软件效率较低),DEM方案可能会由软件实现,因此本文不对其进行讨论。

152 L. 陈和R.尤里安

一般来说,密钥封装机制包含三种算法:
– 一个密钥生成算法 KEM.KeyGen(),该算法以公共系统参数 par 为输入,输出一个公钥/私钥对 (pk, sk)。
– 一个加密算法 KEM.Encrypt(),该算法以 (pk,par) 为输入,输出一个密钥/密文对 (K, C)。
– 一个解密算法 KEM.Decrypt(),该算法以 (sk, C, par) 为输入,输出 K。

公共系统参数 par 取决于具体的方案,在椭圆曲线密码学环境下,应包括定义在给定有限域上的椭圆曲线、一个具有素数阶 q 的椭圆曲线群的子群以及生成元G、一个哈希函数 hash() 和一个密钥派生函数 kdf()。为简便起见,我们省略了 par 中的其他项。

ISO/IEC 18033-2[4]规定了三种基于椭圆曲线密码学(ECC)环境下的基于ElGamal的密钥封装机制方案。它们分别是:基于阿卜达拉、贝拉尔和罗加威工作的ECIES(椭圆曲线集成加密方案)[7,8],基于藤崎和冈本工作的 PSEC(可证明安全的椭圆曲线加密)[22]以及基于克莱默和肖普工作的 ACE(高级密码引擎)[20,21]。最近,一种新的基于椭圆曲线密码学(ECC)环境下的基于ElGamal的密钥封装机制方案已被ISO/IEC采纳,且正在制定 ISO/IEC 18033‐2的修订版以规范该新方案。该方案称为FACE(快速ACE)。

表3显示了这四种密钥封装机制中的算法。请注意,我们为了本文的目的修改了ISO/IEC 18033‐2中使用的符号表示,因为我们希望证明同一组可信平台模块功能可用于所有三种密钥封装机制。

通过使用TPM 2.0芯片来执行密钥封装机制(KEM),我们指的是TPM生成一个公钥/私钥对,将该密钥对存储在TPM保护的环境中,并使用私钥解密一个密钥,该密钥将在后续阶段用于数据封装机制(DEM)操作。为了最大限度地利用TPM,我们仅将涉及私钥的操作交由TPM完成,而其他操作,例如 KEM.Encrypt()算法、 kdf()函数和 hash()函数,则交由软件实现。基于这一考虑,这三种KEM方案可以使用相同的TPM 2.0 ECC功能来实现。

现在,让我们看看如何使用第密钥封装机制。KeyGen() 和 密钥封装机制。Decrypt() 算法,在 ECIES 和 PSEC 中通过若干 TPM 2.0 命令实现,这些命令在第 2.2 节中已介绍。2.2。我们假设能够运行上述软件操作的调用者已获得授权,可使用以下 TPM 命令。
1. 在 密钥封装机制.KeyGen() 算法中,调用者首先选择一个已有的可信平台模块密钥作为父密钥 parentK。如果该密钥存储在可信平台模块之外,调用者使用 TPM2Load() 命令加载该密钥,并从可信平台模块获得一个密钥句柄parentK.handle。为了生成公钥/私钥对 tk=(pk, sk),其中 sk= x和 pk= Y=[x]G,调用者调用

算法敏捷性 – 关于TPM2.0 ECC功能的讨论

TPM2 Create(),接收公共系统参数 par以及 parentK。handle,生成密钥对 tk和一个密钥块tk.blob,并输出该密钥块。请记住,tk.blob包含 sk在 parentK下被加密的内容,pk以及一个用于检查完整性的标签。

  1. 在KEM.Decrypt()算法中,调用者首先使用TPM2Load()将密钥对tk加载到可信平台模块中,该操作将返回一个tk.handle。然后,调用者使用输入的tk.handle和值 C0=[r]P调用TPM2 ECDH ZGen()。可信平台模块将计算并输出 D=[x]C0。调用者可随后在软件中完成其余操作以获得秘密密钥 K,并在

154 L. 陈和R.尤里安

如果必要的检查 C0=[r]P 通过,则可以获取 PSEC 的 K 值;否则调用者将收到失败消息。

在ACE密钥封装机制中,密钥对 tk=(pk, sk)包含四个私钥值 sk=(x1, x2, x3, x4)和四个相应的公钥值 pk=(Y1, Y2, Y3, Y4)。调用者可将其视为四组独立的密钥对 tk1=(Y1, x1)、 tk2=(Y2, x2)、 tk3=(Y3, x3)和 tk4=(Y4, x4)。在 KEM.KeyGen()算法中,调用者将第一个项目符号中的操作运行四次,每次获得一个用于 i=[1, 4]的密钥对 tki。在KEM.Decrypt()算法中,调用者再次将第二个项目符号中的相同TPM命令调用四次,每次以 C0作为输入,但加载不同的密钥对 tki, 以获得(D1, D2, D3, D4)。显然,调用者可以验证值 E,因为 E= D2+[α]D3和 α= Hash(C0||D1)。通过执行解密算法的其余部分,调用者可以验证密文 C,并在验证成功时恢复秘密密钥 K,或在验证失败时获得一个失败消息。

关于FACE方案,首先可能需要对值 T进行一些说明。该方案的 kdf函数不仅生成密钥 K的位,还会生成所谓的 Tag值 T的额外位。Tag值的大小在系统参数中定义。

FACE KEM 算法具有四个公钥和四个私钥。但私钥和公钥之间没有直接关联。在 KEM.KeyGen() 算法中,需要计算两个不带对应私钥的公钥点 G1 和 G2 。为了在此使用 TPM,可以通过两次调用 TPM2 ECDH KeyGen() TPM 命令将其生成为临时点。然后必须生成四个私钥 x1、 x2、 y1、 y2,以及另外两个公钥: C=[x1]G1+[x2]G2 和 D=[y1]G1+[y2]G2。TPM 通过四次调用 TPM2 ECDH ZGen() 命令来计算中间点 X1=[x1]G1、 X2=[x2]G2、 Y1=[y1]G1、 Y2=[x2]G2。主机随后通过将这些点相加以完成计算,得到 C= X1+X2 和 D= Y1+Y2。在 KEM.Decrypt() 算法中,接收方需要计算 t1= x1+ αy1 和 t2= x2+ αy2,然后计算 V=[t1]U1+[t2]U2。为了使用 TPM,必须对等式稍作调整。TPM 通过四次调用 TPM2 ECDH ZGen() 命令来计算中间点 X1=[x1]U1、X2=[x2]U2、 Y1=[y1]U1、 Y2=[y2]U2。主机随后通过计算点 V= X1+ X2+[α](Y1+ Y2)来完成整个计算。

4.2 算法灵活性的局限性

可信平台模块中实现的ECDSA算法在NIST FIPS 186‐3中有描述[23]。该算法也在许多其他规范中定义,例如ISO/IEC 14888‐3[3]和德国联邦信息安全办公室(BSI)TR‐ 03111[12]。尽管存在这种标准的ECDSA方案,[3]还描述了三种其他国家标准方案:
– 椭圆曲线德国数字签名算法(EC‐GDSA)
– 椭圆曲线韩国基于证书的数字签名算法(EC‐KCDSA)
– 椭圆曲线俄罗斯数字签名算法(EC‐RDSA)

算法敏捷性 – 关于TPM2.0 ECC功能的讨论 15 5

如果当前的TPM 2.0规范也能集成到这些方案中,那将是非常理想的。但这似乎是不可能的。一般来说,为了集成TPM来实现某个算法,必须将该算法拆分为两部分,使得TPM可以计算其中一部分,而主机可以计算剩余部分。在此过程中,关键在于主机仅执行那些只需要公钥的操作,任何涉及私钥的操作都必须由TPM完成。如果底层原语像椭圆曲线迪菲‐赫尔曼点乘这样简单,则这种拆分很容易实现。上述密钥封装机制方案就是这种情况。但ECDSA类型的签名方案需要对私钥进行更复杂的操作。例如,当公钥形式为 Y=[x|G时,无法明显地利用现有的TPM命令来计算[x−1]G。

现在,与其在可信平台模块上分别实现每种算法,不如建议将来的可信平台模块相关研究把不同的签名算法拆分为简单的“原子”部分,从而使私钥部分能够轻松地在可信平台模块上实现。

5 算法敏捷性中的兼容性问题

算法兼容性对于算法敏捷性至关重要。然而,在密码学标准化过程中,通常会忽略这一点。这意味着,针对同一密码协议的不同标准经常采用不同且不兼容的实现方式。如果在设计密码协议时已经考虑了可信平台模块(TPM),这将不会成为问题;但如果要将可信平台模块用于增强已有密码系统的安全性,则会带来问题。

可信计算组织(TCG)特别注意到了基于椭圆曲线的施诺尔签名方案的这一问题。因此,他们决定修订TPM 2.0规范中当前的施诺尔签名实现,以优化互操作性。在撰写本文时,该修订的最终版本尚未完成。以下讨论展示了在追求最大程度互操作性时所面临的问题。

基于椭圆曲线的数字签名方案的公共系统参数 par也取决于具体的方案,应包括定义在给定有限域上的椭圆曲线、一个具有素数阶 q的椭圆曲线群的子群及其生成元 G,以及一个哈希函数 hash()。我们用 x表示私钥, Y表示公钥。为简便起见,再次省略 par中的其他项。

Schnorr 签名算法基本上包括以下步骤 :
1. 选择一个随机值 r 并计算点 R=[r]G。2. 通过对点 R 的 x 坐标 Rx 和给定消息 M 进行哈希运算来计算签名值 c,c = hash(M, Rx)。关于该哈希运算在比特层面的不同实现方式,请参见下文讨论。3. 计算签名值 s。此处有两种选择:(a) s= r+ c· x mod q 或 (b) s= r − c· x mod q。4. 返回签名 (c, s)。

156 L. 陈和R.尤里安

Schnorr签名验证算法对消息 M的签名(c, s)的验证包含以下步骤:
1. 计算点 R′。此处必须使用与符号变体相对应的正确版本,即 (a) R′=[s]G−[c]Y 或 (b) R′=[s]G+[c]Y。2. 通过对点R′的x坐标 R′x和消息 M进行哈希运算来计算签名值 c′,即 c′= hash(M, R′x)。3. 如果 c= c′则返回接受,否则返回拒绝。

对于签名值 s的不同计算变体,可以通过对 s值取反而轻松地相互转换, 即如果(c, s)是变体(a)的一个签名,则(c,−s)将是变体(b)的签名(反之亦然)。

现在让我们讨论不同的哈希计算变体。第一个需要决定的是值 Rx的位编码。由于 Rx是具有 q个元素的有限域中的一个元素,因此它可以被编码为长度为 log256(q)的字节串。令此为默认编码。该编码可能包含前导零字节。作为替代编码,可以从默认编码中去除这些前导零。令 trz(x)表示从默认编码的字节串 x中截断前导零的函数。接下来我们必须决定消息 M和值 Rx以何种顺序输入到 hash函数中,即作为 h= hash(M||Rx)或作为 h= hash(Rx||M)。下一个选择涉及对值 h的截断。仅当哈希结果的位大小 λ大于数 q的二进制编码的位大小 l时,即l= log2 q,才需要进行此操作。此时可以选择保持值不变,或截断 h的 λ − l个最低有效位。我们把这个对比特串x的截断记作 trh(x)。最后的选择是,现在可以直接设置 c= h,或者先将 h约简为 h′= hmod q,然后设置 c= h′。

作为对比,在表4中,我们列出了ISO/IEC 14888‐3[3], ISO/IEC 11889[2]和BSI TR‐03111[12]中现有的三种椭圆曲线Schnorr签名方案实现,以及可信计算组织(TCG)最近提出的一种新实现[32]。

6 性能考虑

TPM芯片经过优化,可提供高级别的硬件安全。这意味着它们必须能够抵御复杂的物理攻击,例如故障注入或侧信道泄漏。通过通用准则或FIPS的安全认证可证明该安全级别。同时要求TPM芯片为成本优化设备,这意味着其在处理器速度和内存资源方面将受到一定限制。然而,由于更高的时钟频率、先进的密码协处理器以及固件优化,TPM芯片的性能正在持续提升。

由于TPM芯片通常由多任务操作系统的软件栈调用,其性能也依赖于该软件部分。因此,为TPM芯片提供有意义的性能测量较为困难。

算法敏捷性 – 关于TPM2.0 ECC功能的讨论 15 7

表4. 不同的椭圆曲线Schnorr实现变体

签名(par, x, M) 签名(par, x, M) 签名(par, x, M) 签名(par, x, M) 签名(par, x, M) Verify(par, Y, s, c, M) Verify(par, Y, s, c, M) Verify(par, Y, s, c, M) Verify(par, Y, s, c, M) Verify(par, Y, s, c, M)
国际标准化组织/国际电工委员 会14888‐3[3] r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G R′=[s]G−[c]Y c′= hash(R′x||M) R′=[s]G−[c]Y c′= hash(R′x||M) R′=[s]G−[c]Y c′= hash(R′x||M) R′=[s]G−[c]Y c′= hash(R′x||M) R′=[s]G−[c]Y c′= hash(R′x||M)
国际标准化组织/国际电工委员 会14888‐3[3] c= hash(Rx||M) c= hash(Rx||M)
国际标准化组织/国际电工委员 会14888‐3[3] c= hash(Rx||M) c= hash(Rx||M)
国际标准化组织/国际电工委员 会14888‐3[3] s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′
德国联邦信息安全办公室 (BSI) TR‐03111[12] r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G R′=[s]G+[c]Y R′=[s]G+[c]Y R′=[s]G+[c]Y R′=[s]G+[c]Y R′=[s]G+[c]Y
德国联邦信息安全办公室 (BSI) TR‐03111[12] c= trh(hash(M||Rx)) c= trh(hash(M||Rx)) c= trh(hash(M||Rx)) c′= trh(hash(M||R′ c′= trh(hash(M||R′ c′= trh(hash(M||R′ x)) x))
德国联邦信息安全办公室 (BSI) TR‐03111[12] c= trh(hash(M||Rx)) c= trh(hash(M||Rx)) c= trh(hash(M||Rx)) c′= trh(hash(M||R′ c′= trh(hash(M||R′ c′= trh(hash(M||R′ x)) x))
德国联邦信息安全办公室 (BSI) TR‐03111[12] s= r − c· sk模 q s= r − c· sk模 q s= r − c· sk模 q s= r − c· sk模 q s= r − c· sk模 q 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′
国际标准化组织/国际电工委 员会 11889[2] r ∈[1, q), R=[r]G c= hash(M||(trz(Rx r ∈[1, q), R=[r]G c= hash(M||(trz(Rx r ∈[1, q), R=[r]G c= hash(M||(trz(Rx r ∈[1, q), R=[r]G c= hash(M||(trz(Rx r ∈[1, q), R=[r]G c= hash(M||(trz(Rx R′=[s]G−[c]Y c′= hash(M||(trz(R′ R′=[s]G−[c]Y c′= hash(M||(trz(R′ R′=[s]G−[c]Y c′= hash(M||(trz(R′ R′=[s]G−[c]Y c′= hash(M||(trz(R′ R′=[s]G−[c]Y c′= hash(M||(trz(R′
国际标准化组织/国际电工委 员会 11889[2] 模 q)) 模 q 模 q)) 模 q x x x x
国际标准化组织/国际电工委 员会 11889[2] 模 q)) 模 q 模 q)) 模 q x x x x
国际标准化组织/国际电工委 员会 11889[2] s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′
可信计算组织新提案[32] r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G r ∈[1, q), R=[r]G R′=[s]G−[c]Y k x||M) R′=[s]G−[c]Y k x||M) R′=[s]G−[c]Y k x||M) R′=[s]G−[c]Y k x||M) R′=[s]G−[c]Y k x||M)
可信计算组织新提案[32] c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c′= trh(hash(R′ c′= trh(hash(R′ c′= trh(hash(R′ c′= trh(hash(R′
可信计算组织新提案[32] c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c= trh(hash(Rx||M)) c′= trh(hash(R′ c′= trh(hash(R′ c′= trh(hash(R′ c′= trh(hash(R′
可信计算组织新提案[32] s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q s= r+ c· x模 q 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′ 接受,当且仅当 c= c′

底线是,主机CPU速度更快,但不提供硬件安全,而TPM芯片速度较慢,却能提供更高水平的硬件安全。由于这种性能/安全不对称性,巧妙地在主机 CPU和TPM芯片之间划分算法非常重要。TPM应仅执行涉及私钥的操作。

7 结论与一个开放性问题

在本文中,我们指出TPM 2.0芯片是一个功能相当强大的密码引擎,其潜力可能超过其已发布规范[2]中所规定的内容。这得益于算法敏捷性的特性。然而,算法敏捷性使得环境比各个算法在其原始安全证明中单独实现和分析时更加复杂。因此,对整个TPM/主机系统进行可靠的安全分析成为一个真正的挑战。本文尚未涉及这一课题。我们以一个开放性问题结束本文:如何定义算法敏捷性的安全概念?换句话说,是否可能并如何为TPM 2.0的ECC功能建立一个安全模型并对其进行安全证明?

【源码免费下载链接】:https://renmaiwang.cn/s/y8oc2 ### COUNTIF函数的16种公式设置在Excel中,COUNTIF函数是非常实用的一个功能,它可以帮助用户统计满足特定条件的单元格数量。本篇文章将详细介绍COUNTIF函数的16种不同应用场景及其公式设置方法。#### 1. 统计等于特定数值的单元格数量**公式:** `=COUNTIF(DATA,"12")`- **描述:** 此公式用于统计在`DATA`范围内等于数字12的单元格数量。- **应用场景:** 当需要快速找出数据集中特定数值出现的次数时非常有用。#### 2. 统计小于0的单元格数量**公式:** `=COUNTIF(DATA,"<0")`- **描述:** 统计`DATA`范围内所有值小于0的单元格数量。- **应用场景:** 在财务分析或数据分析中,经常需要识别负数的情况。#### 3. 统计不等于0的单元格数量**公式:** `=COUNTIF(DATA,"<>0")`- **描述:** 计算`DATA`范围内所有值不等于0的单元格数量。- **应用场景:** 适用于排除零值的情况,例如在处理收入、支出等数据时。#### 4. 统计大于5的单元格数量**公式:** `=COUNTIF(DATA,">5")`- **描述:** 统计`DATA`范围内所有值大于5的单元格数量。- **应用场景:** 在需要筛选出大于某一阈值的数据时使用。#### 5. 统计等于另一个单元格值的单元格数量**公式:** `=COUNTIF(DATA,A1)`- **描述:** 统计`DATA`范围内等于`A1`单元格值的单元格数量。- **应用场景:** 当标准值会变化时,可以通过这种方式灵活地进行统计。#### 6. 统计大于另一个单元格值的单元格数量**公式:** `=COUNTI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值