任务详情
密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
1 总结这些API在编程中的使用方式(5分)
2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)
0、 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
-
(1)Crypto API:
作为一部分 Microsoft Windows 提供的应用程序编程接口 (API),CryptoAPI 提供了一组函数。这些函数允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名。实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行
CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。
-
(2)PKCS#11:
架构
会话状态
PKCS#11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API,并将API本身命名为“Cryptoki”(来自“加密令牌接口”,发音为“crypto-key” - 但是“PKCS#11”通常用于指代API以及定义它的标准)。 API定义了最常用的加密对像类型(RSA密钥,X.509证书,DES / 三重DES密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。
在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布[1],它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。
由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。
-
(3)GMT 0016-2012:
层次关系:智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间
设备的应用结构:一个设备中存在设备认证密钥和多个应用,应用之间相互独立。设备的逻辑结构如下图:
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。
本标准适用于智能密码钥匙产品的研制、使用和检测。
-
(4)GMT 0018-2012:
本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。
范围:本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准,适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置:在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终瑞等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。如下图:
1、 总结这些API在编程中的使用方式
Crypto API在编程中的使用方式
CryptoAPI本身不实现密码运算相关操作,而是操作系统通过调用CryptoSPI函数接口相应的加密服务提供者函数(CSP)来实现。CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
信息隐藏
信息隐藏也称作数据隐藏(Data+Hiding),是集多学科理论与技术于一身的新兴技术领域。信息隐藏技术主要是指将特定的信息嵌入数字化宿主信息(如文本,数字化的声音、图像、视频信号等)中,信息隐藏的目的不在于限制正常的信息存取和访问,而在于保证隐藏的信息不引起监控者的注意和重视,从而减少被攻击的可能性,在此基础上再使用密码术来加强隐藏信息的安全性,因此信息隐藏比信息加密更为安全。应该注意到,密码术和信息隐藏技术不是互相矛盾、互相竞争的技术,而是相互补充的技术,他们的区别在于应用的场合不同,对算法的要求不同,但可能在实际应用中需要互相配合。特定的信息一般就是保密信息,信息隐藏的历史可以追溯到古老的隐写术,但推动了信息隐藏的理论和技术研究始于1996年在剑桥大学召开的国际第一届信息隐藏研究会,之后国际机构在信息隐藏领域中的隐写术、数字水印、版权标识,可视密码学等方面取得大量成果。
身份鉴别
标识是实体身份的一种计算机表达。
信息系统在执行操作时,首先要求用户标识自己的身份,并提供证明自己身份的依据,不同的系统使用不同的方式表示实体的身份,同一实体可以有多个不同的身份。
鉴别是将标识和实体联系在一起的过程。鉴别是信息系统的第一道安全防线,也为其他安全服务提供支撑。访问控制机制的正确执行依赖于对用户身份的正确识别,标识和鉴别作为访问控制的必要支持,以实现对资源机密性、完整性、可用性及合法使用的支持。如果与数据完整性机制结合起来使用,可以作为数据源认证的一种方法。
身份鉴别包括单向鉴别、双向鉴别以及第三方鉴别。
在一个给定的网络中,客户A需要访问服务器S的服务,客户A必须被服务器鉴别,这个鉴别过程称为单向鉴别。如果客户A也需要鉴别服务器S,则称为双向鉴别。还有一些情况要求由双方信任的第三方进行鉴别,以确认用户和服务器的身份。
单向鉴别是当用户希望在应用服务器上注册时,用户仅需被应用服务器鉴别。常见的单向鉴别是用户发送其用户名和口令给应用服务器,应用服务器收到的用户名和口令进行验证,确认用户名和口令是由合法用户发出。
双向鉴别是一种相互鉴别,其过程在单向鉴别的基础上还要增加两个步骤:服务器向客户端发送服务器名和口令,客户端确认服务器身份的合法性。这种基于口令的双向鉴别一般不常使用,假如有50个用户(或应用服务器),每个用户若均可与其它用户通信,则每个用户都应有能力鉴别其他用户。在双向鉴别的情况下,还应能被其它用户鉴别,这样每个用户需要保存49个口令。一旦用户增加、减少或改变口令,都要调整口令清单,管理繁琐且效率低。
第三方鉴别是基于可信的第三方存储验证标识和鉴别信息。每个用户或应用服务器都向可信第三方发送身份标识和口令,提高了口令存储和使用的安全性,并且具有较高的效率。
完整性检测
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。
PKCS#11在编程中的使用方式
Cryptoki的通用模型如下图所示。模型从一个或多个必须执行某些密码操作的应用程序开始,以一个或多个密码设备结束(在密码设备上执行某些或全部操作)。一个用户可涉及也可不涉及一个程序。
Cryptoki 为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行。每个对应于一个物理阅读器或另一个设备接口的槽可包含一个令牌。当一台密码设备存在于阅读器中,一个令牌就存在于该槽中。当然,由于Cryptoki提供槽和令牌的逻辑视图,所以可能有其它的物理译码。多个槽可能共享一个阅读器。问题在于一个系统有相当多的槽,应用程序能连接到这些槽的其中任何一个或全部槽的令牌上。
密码设备可以按照某一命令集执行某些密码操作,这些命令通常要经过标准设备驱动程序,例如PCMCIA卡服务程序或槽服务程序。Cryptoki 使每个密码设备看起来逻辑上很象其它设备,而不管什么技术实现的。因此,应用程序不必直接与设备驱动器接口(或甚至不必知道包括那些设备);Cryptoki 隐藏了这些细节。的确,基础设备完全能用软件来实现,(例如,在一个服务器上运行的处理程序),不须专用硬件。
Cryptoki 或许可以作为支持接口功能的库来实现,而应用程序则与该库连接。应用程序可以直接与Cryptoki 连接,或者,Cryptoki 是一个所谓的“共享”库(或动态连接库),在这种情况下,应用程序动态地连接库。用Microsoft Windows和OS/2操作系统可以比较容易地生成数据库,并且在UNIX和DOS中也可相对容易地生成“共享”库。
由于新库可以使用,所以动态方法有许多优点;但从安全的角度来说,也有一些缺点。要特别指出的是,如果库能较容易地被替换,攻击者有可能用恶意制造的假库取而代之,以截取用户的PIN。即使编码签名技术能防止许多动态连接的安全危险,从安全角度来说,一般采用直接连接。总之,应用程序和Cryptoki 库之间的程序设计接口是相同的。
设备的种类和所支持的能力的种类将取决于专用Cryptoki 库。本标准只定义库的接口,不定义库的特征。要特别指出的是,并不是所有的库支持这个接口(因为不是所有的令牌支持所有的机制)中定义的机制(算法)。并且库也许只支持可使用的所有密码设备的一个子集。(当然,可以预料更多更好的设备种类将被开发,以支持多种令牌,而不是单个供应商提供的令牌。)只要开发出应用程序,就会形成Cryptoki 的接口、标准数据库和令牌“轮廓”。
令牌的逻辑视图
Cryptoki的令牌逻辑视图是一个能存储对象和能执行密码函数的设备。Cryptoki定义如下三个对象:数据、证书和密钥。数据对象由应用程序定义。一个证书对象存储一个证书。一个密钥对象存储一个密码密钥。密钥可以是一个公共密钥、一个私钥或是一个保密密钥,每个种类的密钥在专用机制中使用其的辅助型。令牌的这种逻辑视图如下图所示:
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范:
GMT 0016-2012 智能密码钥匙密码应用接口规范:
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。本标准适用于智能密码钥匙产品的研制、使用和检测。
GMT 0018-2012密码设备应用接口规范:
本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
2、 列出这些API包含的函数,进行分类,并总结它们的异同
Crypto API包含的函数
CryptoAPI体系主要由以下几部分组成:
基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。
基本加密函数
服务提供者函数
密钥的产生和交换函数
编码/解码函数
数据加密/解密函数
哈希和数字签名函数
证书和证书库函数
这组函数是管理、使用和取得证书、证书撤销列表和证书信任列表。
证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
维护函数
证书函数
证书撤销列表函数
证书验证函数
证书验证是通过CTL 和证书列表进行的.
使用CTL的函数
证书链验证函数
PKCS#11包含的函数
CSP总共有23个函数接口。简介如下:
CSP连接函数:
CPAcquireContext:为应用程序创建一个上下文
CPGetProvParam:返回CSP相关的信息
CPReleaseContext:释放CPAcquireContext创建的上下文
CPSetProvParam :设置CSP的参数操作
CSP密钥生成和交换函数:
CPDeriveKey:从一个数据散列中生成一个会话密钥,它保证生成的密钥 互不相同
CPDestroyKey:释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问
CPExportKey:从CSP容器中导出密钥
CPGenKey:用来生成密钥或密钥对
CPGenRandom:使用随机数填充一个缓冲
CPGetKeyParam:用来得到加密操作密钥的属性
CPGetUserKey:用来获取CSP容器中的持久密钥对
CPImportKey:从一个blob中导入密钥到CSP容器中
CPSetKeyParam:设置密钥的属性
CSP加解密函数:
CPDecrypt:用来解密先前被加密的数据
CPEncrypt:用来加密明文
CSP散列和数字签名函数:
CPCreateHash:初始化并散列输入数据
CPDestroyHash:删除一个散列对象句柄
CPDuplicateHash:创建一个散列对象的拷贝
CPGetHashParam:获取散列对象的计算结果
CPHashData:散列输入的数据
CPSetHashParam:定制一个散列对象的属性
CPSignHash:签名一个散列对象
CPVerifySignature:校验一个数字签名
GMT 0016-2012
设备管理系列函数:
SKF_WaitForDevEvent:等待设备插拔事件
SKF_ CancelWaitForDevEvent:取消等待设备插拔事件
SKF_ EnumDev :枚举设备
SKF_ ConnectDev:连接设备
SKF_ DisconnectDev :断开连接
SKF_ GetDevState:获取设备状态
SKF_ SetLabel:设置设备标签
SKF_ GetDevInfo:获取设备信息
SKF_ LockDev:锁定设备
SKF_ UnlockDev:解锁设备
SKF_Transmit:设备命令传输
访问控制系列函数:
SKF_ ChangeDevAuthKey:修改设备认证密钥
SKF_DevAuth:设备认证
SKF_ ChangePIN:修改PIN
SKF_ GetPINInfo:获得PIN码信息
SKF_ VerifyPIN:校验PIN
SKF_ UnblockPIN:解锁PIN
SKF_ ClearSecueState:清除应用安全状态
应用管理系列函数:
SKF_ CreateApplication:创建应用
SKF_ EnumApplication:枚举应用
SKF_ DeleteApplication:删除应用
SKF_ OpenApplication:打开应用
SKF_ CloseApplication:关闭应用
文件管理系列函数:
SKF_ CreateFile:创建文件
SKF_ DeleteFile :删除文件
SKF_ EnumFiles:枚举文件
SKF_ GetFileInfo:获取文件信息
SKF_ ReadFile:读文件
SKF_ WriteFile :写文件
容器管理系列函数:
SKF_CreateContainer:创建容器
SKF_ DeleteContainer:删除容器
SKF_ EnumContainer:枚举容器
SKF_ OpenContainer:打开容器
SKF_ CloseContainer:关闭容器
SKF_ GetContainerType:获得容器类型
SKF_ ImportCertificate:导人数字证书
SKF_ ExportCertificate:导出数字证书
密码服务系列函数:
SKF_ GenRandom :生成随机数
SKF_ GenExtRSAKey:生成外部RSA密钥对
SKF_ GenRSAKeyPair:生成RSA签名密钥对
SKF_ ImportRSAKeyPair:导人RSA加密密钥对
SKF_ RSASignDataRSA:签名
SKF_ RSAVerify:RSA验签
SKF_ RSAExportSessionKey:RSA生成并导出会话密钥
SKF_ ExtRSAPubKeyOperation:RSA外来公钥运算
SKF_ ExtRSAPriKeyOperation:RSA外来私钥运算
SKF_ GenECCKeyPair:生成ECC签名密钥对
SKF_ ImportECCKeyPair:导入ECC加密密钥对
SKF_ ECCSignData :ECC签名
SKF_ ECCVerify:ECC验签
SKF_ ECCExportSessionKey:ECC生成并导出会话密钥
SKF_ExtECCEncrypt:ECC外来公钥加密.
SKF_ ExtECCDecrypt:ECC外来私钥解密.
SKF_ ExtECCSign:ECC外来私钥签名.
SKF_ ExtECCVerify :ECC外来公钥验签.
SKF_ GenerateAgreementDataWithECC:ECC生成密钥协商参数并输出
SKF_ GenerateKeyWithECC:ECC计算会话密钥.
SKF_ GenerateAgreementDataAndKeyWithECC:ECC产生协商数据并计算会话密钥
SKF_ExportPablicKey:导出公钥
SKF_ImportSessionKey:导入会话密钥
SKF_ SetSymmKey:明文导人会话密钥
SKF_ EncrypInit:加密初始化
SKF_ Encrypt:单组数据加密
SKF_ EncryptUpdate:多组数据加密
SKF_ EncryptFinal:结束加密
SKF_ Digestlnit:密码杂凑初始化
SKF_Digest:单组数据密码杂凑
SKF_ DigestUpdate:多组数据密码杂凑
SKP_ DigestFinal:结束密码杂凑
SKF_ MacInit:消息鉴别码运算初始化
SKF_ Mac:单组数据消息鉴别码运算
SKF_ MacUpdate:多组数据消息鉴别码运算
SKF_ MacFinal:结束消息鉴别码运算
SKF_ CloseHandle:关闭密码对象句柄
GMT 0018-2012
设备管理:
打开设备:SDEOpenDerice
关闭设备:SDF_ Cias eDevice
创建会话:SDF_ OpenSesion
关闭会话: SDF _CloseSession
获取设备信息:SDF _GetDeviceInfo
产生随机数:SDF_enerateRandom
获取私钥使用权限:SDF _GetPrivateKeyAccessRight
释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
密钥管理:
导出 RSA签名公钥:SDF_ ExportSignPublicKey_ RSA
导出 RSA加密公钥:SDF_ ExportEncPublicKey_ RSA
产生 RSA非对称密钥对并输出:SDF_ GenerateKeyPair_RSA
生成 会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK ,RSA
生成会 话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_ RSA
导人会 话密钥并用内部RSA私钥解密:SDF_ ImportKeyWithISK_ RSA
基于 RSA算法的数字信封转换:SDF_ ExchangeDigitEnvelopeBaseOnRSA
导出 ECC签名公钥:SDF_ ExportSignPublicKey_ ECC
导出 ECC加密公钥:SDF_ ExportEncPublicKey_ ECC
产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ ECC
生成会 话密钥并用内部:ECC公钥加密输出:SDF_ GenerateKeyWithIPK_ ECC
生成会话密 钥并用外部:ECC公钥加密输出: SDF_ GenerateKeyWithEPK_ ECC
导人会话密钥并用内部:ECC私钥解密:SDF_ ImportKeyWithISK_ ECC
生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
计算会话密钥:SDF_GenerateKeyWithECC
产生协商数据并计算会话密钥:SDF_ GenerateAgreementDataAndKeyWithECC
基于ECC算法的数字信封转换:SDF_ ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出:SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密:SDF_ ImportKeyWithKEK
销毁会话密钥:SDF_DestroyKey
非对称算法运算类函数:
外部公钥RSA运算:SDF_ ExternalPublicKeyOperation_ RSA
内部公钥RSA运算:SDF_ InternalPublicKeyOperation_ RSA
内部私钥RSA运算:SDF_InternalPrivateKeyOperation_ RSA
外部密钥ECC验证:SDF_ ExternalVerify_ECC
内部密钥ECC签名:SDF_ nternalSign_ ECC
内部密钥ECC验证:SDF_ InternalVerify_ ECC
外部密钥ECC加密:SDF_ ExternalEncrypt_ECC
对称算法运算类函数
对称加密:SDF_Encrypt
对称解密:SDF_Decrypt
计算MAC:SDF_CalculateMAC
杂凑运算类函数
杂凑运算初始化:SDF_HashInit
多包杂凑运算:SDF_HashUpdate
杂凑运算结束:SDF_HashFinal
用户文件操作类函数:
创建文件:SDF_CreatFile
读取文件:SDF_ReadFile
写文件:SDF_WriteFile
删除文件:SDF_DeleteFile
总结异同
-
Crypto API:
- Crypto API 是一个通用术语,指代一类用于加密和解密、散列、数字签名等密码学操作的编程接口。具体实现可以在不同的编程语言和平台上,例如在Java中的Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE),或者在C/C++中的OpenSSL等。
- Crypto API 的具体函数取决于实际的实现。在不同的API中可能有不同的函数和用法。
-
PKCS#11:
- PKCS#11 是密码学消息语法标准 (Public-Key Cryptography Standards) 中的一部分,定义了用于安全令牌(如智能卡)和加密设备的API。它包含了一系列用于安全设备操作的函数。
- PKCS#11 主要用于与硬件安全模块(HSM)进行交互,提供了一种标准的方式来访问密码学功能。它的函数集合是针对于与安全设备进行交互而设计的。
-
GMT 0016-2012 和 GMT 0018-2012:
- 这两个标准可能是特定国家或组织定义的加密和安全相关的标准。它们可能也包含了一些函数或接口,用于实现这些标准所规定的加密算法或安全协议。
在总体上,这些标准和API可能有一些相同之处,比如它们都提供了一些用于加密、解密、签名等操作的函数。然而,它们也各自针对不同的使用场景和需求,因此具体的函数集合和用法可能会有所不同。
3、 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
(一)SKF接口
龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln
(二)Crypto API
龙脉密码钥匙驱动实例工具等\mToken
GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln
(三)PKCS#11
龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln
DES
DES3
RC2
RC4
RSA
AES