首页 > 其他分享 >实验一-密码引擎-3-加密API研究

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

时间:2024-04-13 16:22:05浏览次数:29  
标签:API 加密 函数 证书 密码 SDF 引擎 密钥

一、微软的Crypto API

参考网站: https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/cryptoapi-system-architecture

https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Crypto_API

https://www.w3.org/TR/2017/REC-WebCryptoAPI-20170126/

https://blog.csdn.net/liuhuiyi/article/details/7778123

CryptoAPI体系主要由以下几部分组成:

基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。

(1)基本加密函数

用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。

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

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

(2)证书编码/解码函数

用于加密或解密数据的函数。 还支持 哈希数据。有关详细信息,请参阅数据加密和解密函数和数据加密和解密。

(3)证书Microsoft Store函数

用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。

(4)简化的消息函数

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

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

用于验证已接收消息和相关数据的签名的真实性的函数。

有关详细信息,请参阅简化的消息和简化的消息函数。

(5)低级别消息函数

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

IMG_256

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

功能区域

函数名称约定

基本加密函数

Crypt

编码/解码函数

Crypt

证书存储函数

存储

简化的消息函数

消息

低级别消息函数

Msg

​ 应用程序在所有这些领域都使用函数。这些函数组合在一起,组成 CryptoAPI。 基本加密函数将 CSP 用于必要的加密算法以及加密密钥的生成和安全存储。

使用了两种不同类型的加密密钥:会话密钥(用于单个加密/解密)和公钥/私钥对,这些密钥在更永久的基础上使用。

二、RAS公司的PKCS#11标准

官方文档和相关博客链接:

PKCS #11 Cryptographic Token Interface Base Specification Version 2.40 (oasis-open.org)

docin.com/p-86863089.html

OASIS PKCS 11 TC - OASIS (oasis-open.org)

​ PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。

PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。

PKCS#11主要是应用于智能卡和HSM。

PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。

PKCS密码中间件位于上层应用和底层安全设备之间,应用基于 PKCS#11 标准接口开发各类应用程序。主要包括2个库

主API库:提供给应用的PKCS11接口。

tokenDLL库:由主 API 库调用,完成从上向下到指定设备的套接。

安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。

PKCS #11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限,而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象,PKCS #11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。

PKCS#11创建和支持下列对象:

PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。

PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:一类是公开对象,这类对象是任何用户都可以访问的;另一类是私有对象,这一类对象只有身份被验证的用户才有权访问。决定对象的访问限制类型的模板属性是CKA_PRIVATE。

三、GMT 0016-2012 智能密码钥匙密码应用接口规范

相关文档链接:

gmbz\.org\.cn/main/viewfile/20180110020423162671\.html

接口规范

GMT 0016-2012是国家规定的智能密码钥匙密码应用接口规范,规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。适用于智能密码钥匙产品的研制、使用和检测。

规范性引用文件

下列文件对于本标准的应用是必不可少的。凡是注日期的引用文件。仅所注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范

IMG_256

四、GMT 0018-2012密码设备应用接口规范

相关文档链接:

gmbz\.org\.cn/main/viewfile/20180110020642562680\.html

接口标准

GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。

规范性引用文件

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。

其中还包括了对部分术语的规定:IMG_256

使用方式

Crypto API

使用CryptoAPI编写一个文件保护程序,具有如下功能:

给定明文文件,生成加密文件,同时产生文件的数字签名文件;

给定密文文件,解密出明文文件,并验证签名的正确性。

​ 在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。

信息隐藏

信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文。  数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。  加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。

身份鉴别

安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。  身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。  因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。  数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。  数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。  证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。

完整性检验

任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。  信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。

PKCS#11

架构

IMG_256

会话状态

IMG_257

对象

IMG_258

GMT 0016-2012

层次关系

智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间,如下图所示。

IMG_259

应用结构

IMG_260

GMT 0018-2012

在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机,密码卡,智能密码终端等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。如下图所示。

IMG_261

基础密码服务包括密钥生成、单一的密码运算、文件管理等的服务。本标准采用C语言描述接口函数。如无特别说明,函数中参数的长度单位均为字节数。

API函数

Crypto API

基本加密函数

CSP是真正实行加密的独立模块,他既可以由软件实现也可以由硬件实现。但是他必须符合CryptoAPI接口的规范。  每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,这样便于CryptoAPI找到对应的CSP。目前已经有9种CSP类型,并且还在增长。下表列出出它们支持的密钥交换算法、签名算法、对称加密算法和Hash算法。

CSP类型

交换算法

签名算法

对称加密算法

Hash算法

PROV_RSA_FULL

RSA

RSA

RC2,RC4

MD5,SHA

PROV_RSA_SIG

none

RSA

none

MD5,SHA

PROV_RSA_SCHANNEL

RSA

RSA

RC4,DES,Triple DES

MD5,SHA

PROV_DSS

DSS

none

DSS

MD5,SHA

PROV_DSS_DH

DH

DSS

CYLINK_MEK

MD5,SHA

PROV_DH_SCHANNEL

DH

DSS

DES,Triple DES

MD5,SHA

PROV_FORTEZZA

KEA

DSS

Skipjack

SHA

PROV_MS_EXCHANGE

RSA

RSA

CAST

MD5

PROV_SSL

RSA

RSA

Varies

Varies

​ 基本加密函数为开发加密应用程序提供了足够灵活的空间。所有CSP 的通讯都是通过这些函数。  一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作。  如果使用多于一个以上的CSP,在加密函数调用中就要指定所需的CSP。微软基本加密提供者(Microsoft Base Cryptographic Provider),是缺省绑定到CryptoAPI 里的。如果没有指定其他CSP 时,这个CSP 就是却省的。  每一个CSP 对CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,而其他一些CSP 包含了对硬件的支持,比如智能卡。另外,一些CSP 偶尔和使用者直接通讯,比如数字签名就使用了用户的签名私钥。  基本加密函数包含了以下几种:

服务提供者函数

应用程序使用服务提供者函数来连接和断开一个CSP。下面就是主要的API:

IMG_256

密钥的产生和交换函数

密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:

IMG_257

编码/解码函数

有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。以下就是这几个函数:

IMG_258

数据加密/解密函数

这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。

IMG_259

哈希和数字签名函数

这些函数在应用程序中完成计算哈希、创建和校验数字签名。

IMG_260

证书和证书库函数

这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。这些函数可以分成一下几组:

证书库函数

​ 一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。  以下就是这些函数:

IMG_261

维护函数

CryptoAPI 提供了证书和证书库函数如下:

IMG_262

证书函数

下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。

IMG_263

证书撤销列表函数

IMG_264

证书信任列表函数

IMG_265

扩展属性函数

IMG_266

证书验证函数

证书验证是通过CTL 和证书列表进行的。

使用CTL 的函数

IMG_267

证书链验证函数

IMG_268

消息函数

​ CryptoAPI 消息函数包括两组:低级消息函数和简化消息函数。  低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。  简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。

低级消息函数

IMG_269

简化消息函数

IMG_270

辅助函数

数据管理函数

IMG_271

数据转换函数

IMG_272

增强密钥用法函数

IMG_273

密钥标示函数

IMG_274

证书库回调函数

IMG_275

OID支持函数

IMG_276

远程对象恢复函数

IMG_277

PFX 函数

IMG_278

PKCS#11

PKCS#11创建和支持下列对象:

IMG_279

PKCS#11的对象可根据其生命期长短的不同分成两大类:

  • 持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;
  • 会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。

​ 决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。  P11标准颁发了70余条指令。其中部分指令简介如下表:

IMG_280

IMG_281

IMG_282

IMG_283

IMG_284

GMT 0016-2012

设备管理系列函数

IMG_285

访问控制系列函数

IMG_286

应用管理系列函数

IMG_287

文件管理系列函数

IMG_288

容器管理系列函数

IMG_289

密码服务系列函数

IMG_290

IMG_291

GMT 0018-2012

设备管理类函数

设备管理类函数包括以下具体函数:

  • 打开设备: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私钥解密∶SDF_ImportKeyWithISK_ECC
  • 生成密钥协商参数并输出;SDF_GenerateAgreementDataWithECC
  • 计算会话密钥∶SDF_GenerateKeyWiuhECC
  • 产生协商数据并计算会话密钥∶SDF_GenerateAgreementDataAndKeyWithECC
  • 基于 ECC算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnECC
  • 生成会话密钥并用密钥加密密钥加密输出∶SDF_GenerateKeyWithKEK
  • 导入会话密钥并用密钥加密密钥解密∶SDF_ImportKeyWithKEK
  • 销毁会话密钥∶SDF_DestroyKey

以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接

SKF接口

龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln

IMG_256IMG_257

Crypto API

龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln

要在当前目录下先创建 20211310.txt

IMG_258IMG_259

龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts\EnumCerts.sln

IMG_256

PKCS#11

龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln

DES

IMG_257IMG_258

其余选项省略

龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln

IMG_259

标签:API,加密,函数,证书,密码,SDF,引擎,密钥
From: https://www.cnblogs.com/heweiye/p/18133019

相关文章

  • 02_Web Api使用Jwt
    JWT(JSONWebToken)是一种用于在网络应用之间传递信息的开放标准(RFC7519)。它使用JSON对象在安全可靠的方式下传递信息,通常用于身份验证和信息交换。在WebAPI中,JWT通常用于对用户进行身份验证和授权。当用户登录成功后,服务器会生成一个Token并返回给客户端,客户端在接下来的请求......
  • 国密 SM2 的非对称加密解密过程
    国密SM2的非对称加密解密过程椭圆曲线椭圆曲线是由一组方程描述的点的集合:y2=x3+ax+b其中a,b满足(4a3+27b2≠0)SM2定义了一个sm2p256v1的椭圆曲线方程各种参数BigIntegerp=FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF......
  • 云场景下的代理重加密 Proxy Re-Encryption
    目录主页引言代理重加密代理重加密关键流程实践&应用总结参考资料主页个人微信公众号:密码应用技术实战个人博客园首页:https://www.cnblogs.com/informatics/引言2022年12月,人工智能迎来了一件大事,OpenAI的ChatGPT横空诞生,成为了现象级产品。如果说算力是人工智能的发动机,那......
  • php rsa长文加密解密
    密钥类型:1024bit:分段加密字节数为117,分段解密字节数为128。2048bit:分段加密字节数为245,分段解密字节数为256。 classRsaBill{private$public_key_resource;private$private_key_resource;publicfunction__construct(){$this->public_key......
  • FastAPI: 测试lifespan特性(转)
    addbyzhj:实践出真知,文章写得真不错,自己测试这些条件原文:FastAPI:experimentlifespanfeatureInitInFastAPI,oneofwayscreatingasharedresourceandlivingaslongasapplicationisupisusing lifespan featureinFastAPI.Thislifespanfeaturecandoc......
  • 【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目
    本插件可以使用蓝图获取到项目的一些基本配置,如获取:公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许窗口重设大小、允许关闭、允......
  • Java如何自行实现正向地理编码算法(不依赖api,不联网)
    政务场景中经常会遇到地址落图,或者三维挂接的场景。如何将文本地址转化为gps坐标是实现要解决的核心问题。addresstool为正向地理编码提供了非常简单、高效的算法。如何实现正向地理编码,只需要3步就行:第一步:带有坐标的标准地址加载到addresstool中。第二部:以业务地址作为参数,使......
  • PSQL_标准API和Interface基本的用法和比较
      一、简介   1.API调用的6个参数    2.处理后错误信息的处理    3.API成功与否的判断依据    4.API和Interface的区别和优点 二. 具体分析1、API调用的6个参数        2. 处理后错误信息的处理IF(fnd_msg_pub.count_msg>0)THE......
  • JS逆向中特殊RSA加密密钥
    在对某个网站的接口进行逆向的时候发现其使用了RSA加密,但是其中的密钥生成方式比较特殊。JS部分代码如下所示:varf=newn.jsbn.BigInteger("9E08DA9CB4357388754D6AFF8ED0E1A9C46CD927291ACBC26C08E97E80BC8FFA1F9ABD31CDE9587785183A51************************************......
  • 【Camunda】SpringBoot优雅集成Camunda 7工作流引擎,保姆级教程!
    From: https://mp.weixin.qq.com/s/lZmIucZYzqqwjBCtDAL9WA前言项目中需要用到工作流引擎来设计部分业务流程,框架选型最终选择了Camunda7,关于Camunda以及Activity等其他工作流引擎的介绍及对比不再介绍,这里只介绍与现有Springboot项目的集成以及具体使用及配置概念流程......