实验一-密码引擎-3-加密API研究

任务详情

密码引擎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分)

一.Crypto API

Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。CryptoAPI 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7 标准格式编码和解码等。现在CryptoAPI的最新版本为2.0版本。

CryptoAPI 系统体系结构

由五个主要功能区域组成:

1. 基本加密函数

  • 用于连接到 CSP 的 上下文函数。 这些函数使应用程序可以按名称选择特定 CSP,或选择可以提供所需的功能类别的特定 CSP。

  • 用于生成和存储 加密密钥的 密钥生成函数。 更改 链接模式、 初始化矢量和其他加密功能包含完全支持。 有关详细信息,请参阅密钥生成和 Exchange 函数。

  • 用于交换或传输密钥的 密钥交换功能。 有关详细信息,请参阅加密密钥存储和 Exchange以及密钥生成和 Exchange 函数。

2. 证书编码/解码函数

  • 用于对数据进行加密或解密的函数。 还包括对 哈希 数据的支持。 有关详细信息,请参阅 数据加密和解密功能 以及 数据加密和解密。

3. 证书存储函数

  • 用于管理数字证书集合的函数.有关详细信息,请参阅数字证书和证书存储功能。

4. 简化消息函数

  • 用于加密和解密消息和数据的函数。

  • 用于对消息和数据进行签名的函数。

  • 用于验证收到的消息和相关数据的签名真实性的函数。
    有关详细信息,请参阅简化消息和简化消息功能。

5. 低级别消息函数

  • 用于执行简化消息函数执行的所有任务的函数。 低级别消息函数比简化消息函数提供的灵活性更高,但需要更多函数调用。 有关详细信息,请参阅 低级消息 和 低级别消息函数。

    每个功能区域的函数名称中都有一个关键字字,指示其功能区域。

    应用程序使用所有这些区域中的函数。 这些函数共同构成了 CryptoAPI。 基本加密函数使用 csp 来实现必要的加密算法,并使用 加密密钥的生成和安全存储。
    使用了两种不同类型的加密密钥:用于单个加密/解密的 会话密钥以及用于更永久性的 公钥/私钥对。

CryptoAPI CSP类型

参考文档:
https://docs.microsoft.com/zh-cn/windows/win32/seccrypto/cryptoapi-system-architecture?redirectedfrom=MSDN
https://docs.microsoft.com/zh-cn/windows/win32/seccertenroll/cryptoapi-cryptographic-service-providers?redirectedfrom=MSDN

二.PKCS#11

简介

在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布,它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。
由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。

PKCS#11创建和支持对象


PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。

部分指令简介

PKCS#11架构

三.GMT 0016-2012

本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。

结构模型

设备应用结构


应用由管理员PIN、用户PIN、文件和容器组成,可以存在多个文件和多个容器。

设备信息

设备管理系列函数

密码服务系列函数


GMT 0018-2012

本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。
在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终端等设备组成,通过该标准规定的密码设备应用接口向通用密码服务层提供基础密码服务,如下图所示:

  • 基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。

  • 本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。

设备管理类函数

  • 打开设备:SDF_OpenDevice

  • 关闭设备:SDF_CloseDevice

  • 创建会话:SDF_OpenSession

  • 关闭会话:SDF_CloseSession

  • 获取设备信息:SDF_GetDeviceInfo

  • 产生随机数:SDF_GenerateRandom

  • 获取私钥使用权限: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私钥解密:SDFJmportKeyWithlSKJECC

  • 生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC

  • 计算会话密钥:SDF_GenerateKey WithECC

  • 产生协商数据并计算会话密钥: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_InternalSign_ECC

  • 内部密钥 ECC 验证:SDF_InternalVerify_ECC

  • 外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC

对称算法运算类函数

  • 对称加密:SDF_Encrypt

  • 对称解密:SDF_Decrypt

  • 计算MAC:SDF_CalculateMAC

杂凑运算类函数

  • 杂凑运算初始化:SDF_HashInit

  • 多包杂凑运算:SDF_HashUpdate

  • 杂凑运算结束:SDF_HashFinal

安全要求

(1)基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求:
设备密钥的使用不对应用系统开放;
密钥必须用安全的方法产生并存储;
在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外;
密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取;
密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。
(2)密码服务要求:
使用的密码算法应得到国家密码主管部门的批准;
使用国家密码主管部门认可的密码算法芯片;
本标准所列的所有接口函数均应能被应用系统任意调用。
(3)设备状态要求:
密码设备应具有初始和就绪两个状态;
未安装设备密钥的密码设备应处于初始状态,已安装设备密钥的密码设备应处于就绪状态;
在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作;
在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。
(4)其他要求:
密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份、恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现

四.总结异同

同:大致流程相似,先连设备,进行设备操作,然后进行密钥管理,然后进行算法运算,且密码算法的大致相似,都初始化,单组操作,多组操作,结束这四步。
异:使用接口不同,Crypto API使用CSP,PKCS#11使用KI,GMT 0016-2012使用SKF,GMT 0018-2012使用SDF。

五.运行截图

1.Crypto API

 

2.PKCS#11

 

3.SKF

 

 

 

posted @ 2023-04-03 22:01  遥鱼  阅读(65)  评论(0编辑  收藏  举报