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

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

时间:2024-04-10 14:44:53浏览次数:31  
标签:API SKF RSA SDF 引擎 密钥 ECC 加密

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

一、查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)

1.Crypto API

  1. 微软的CryptoAPI是PKI推荐使用的加密 API。
  2. 功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。
  3. CryptoAPI共有五部分组成:
  • 简单消息函数(Simplified Message Functions)
  • 低层消息函数(Low-level Message Functions)
  • 基本加密函数(Base Cryptographic Functions)
  • 证书编解码函数(Certificate Encode/Decode Functions)
  • 证书库管理函数(Certificate Store Functions)。
    其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。

2.PKCS#11

全称为Public Key Cryptography Standard ,是一组密码学 API 规范,用于安全设备(例如智能卡、USB 密钥令牌、硬件安全模块等)与应用程序之间的通信。它由美国国家标准与技术研究所(NIST)定义,并由美国国家安全局(NSA)制定。以下是PKCS#11的详细介绍:

  1. 目的

    • PKCS#11的主要目的是为了提供一个统一的接口,使得应用程序能够与安全设备进行安全通信,并能够执行诸如数字签名、加密、解密、密钥管理等操作。
    • 它为开发人员提供了一种标准的方式来与安全设备进行交互,而无需关心设备的特定实现细节。
  2. 功能

    • 提供对安全设备中的密钥和证书的管理和操作功能,包括生成、导入、导出、销毁密钥和证书等。
    • 支持对数据进行加密、解密、签名和验证等操作。
    • 提供访问安全设备中的随机数生成器和伪随机数生成器。
    • 支持会话管理,允许应用程序与安全设备之间建立和终止会话,以便进行密钥操作等。
    • 提供安全设备的管理功能,如初始化、重置 PIN 码等。
  3. 主要组件

    • 对象(Objects):在PKCS#11中,密钥、证书、数据等都被表示为对象。这些对象可以是存储在安全设备中的,也可以是在会话期间动态创建的。
    • 机制(Mechanisms):PKCS#11定义了一系列加密、解密、签名、验证等操作的机制,应用程序可以使用这些机制来执行相应的操作。
    • 会话(Session):会话是应用程序与安全设备之间的一个通信通道,通过会话,应用程序可以进行密钥操作等操作。
    • 模块(Module):PKCS#11模块是实现PKCS#11规范的软件库或硬件设备,它负责与安全设备进行通信,并提供PKCS#11 API。
  4. 常见应用

    • PKCS#11常用于安全电子商务、数字证书管理、加密通信、安全访问控制等领域。
    • 由于其开放的标准化接口,PKCS#11在网络安全和信息安全领域得到了广泛的应用,成为了一种重要的安全基础设施。

总的来说,PKCS#11是一套用于安全设备与应用程序之间通信的密码学 API 规范,它提供了统一的接口和功能,使得开发人员能够轻松地使用安全设备进行安全操作和通信。

3.GMT 0016-2012

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

4.GMT 0018-2012

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

二、总结这些API在编程中的使用方式

1.Crypto API

可以按照如下顺序调用接口实现摘要:

摘要运算——调用CryptAcquireContext方法。

实际上,下面介绍的每一个密码运算基本都要先通过调用此方法,设置相应的密码运算参数,并返回相应的CSP句柄,用于后面的运算。此方法调用成功返回true(-1),否则返回false(0),并可以调用GetLastError返回具体错误信息。

BOOL CryptAcquireContext (
HCRYPTPROV * phProv, //返回的CSP句柄
LPCTSTR pszContainer, //要使用的密钥是在容器,摘要运算不涉及密钥,所以这里设置为NULL
LPCTSTR pszProvider, //使用到的CSP的名称,如果设置为NULL,则CryptAcquireContext会调用系统缺省CSP
DWORD dwProvType, //所使用的CSP的类型,一般这里设置为PROV_RSA_FULL(0x1)
DWORD dwFlags //标志值,如果是涉及到私钥的运算,如签名或解密,应设置为0,否则应设置成CRYPT_VERIFYCONTEXT。
)

调用CryptCreateHash方法生成一个摘要运算的对象。

此方法调用成功返回true(-1),否则返回false(0)。

BOOL CryptCreateHash(
HCRYPTPROV hProv, //上一步返回的CSP句柄
ALG_ID Algid, //摘要算法
HCRYPTKEY hKey, //设置成0
DWORD dwFlags, //设置成0
HCRYPTHASH * phHash //返回的摘要运算对象
)

调用CryptHashData方法进行摘要运算。

此方法调用成功返回true(-1),否则返回false(0)。

BOOL CryptHashData(
HCRYPTHASH hHash, //上一步返回的摘要运算对象
BYTE * pbData, //原文
DWORD dwDataLen, //原文长度
DWORD dwFlags //设置成0
)

调用CryptGetHashParam返回摘要的各种相关数据信息。

BOOL CryptGetHashParam(
HCRYPTHASH hHash, //上一步返回的摘要运算对象
DWORD dwParam, //返回摘要的数据长度时:HP_HASHSIZE(0x0004),返回摘要值时:HP_HASHVAL(0x0002)
BYTE *pbData, //返回摘要的数据长度时:长度值,返回摘要值时:摘要值
DWORD *pdwDataLen, //长度值所占字节数
DWORD dwFlags //设置为0
)

对称加密

生成摘要(同上)

CryptAcquireContext //返回CSP句柄,参数设置与摘要运算时一致。
CryptCreateHash //生成摘要运算对象。
CryptHashData //生成摘要。pbData为调用加密功能的上位程序输入的加密口令。

生成一个会话密钥,用来加密数据。

BOOL CryptDeriveKey(
HCRYPTPROV hProv, //上一步返回的CSP句柄
ALG_ID Algid, //加密算法
HCRYPTHASH hBaseData, //上一步返回的摘要对象
DWORD dwFlags, //密钥类型,如果调用的CSP没有特别要求,设置为0
HCRYPTKEY * phKey //返回的密钥对象
)

设置密钥参数。

PS:如果采用的是RC2\RC4等流加密算法,这一步可以省略。如果采用的是分组加密算法,那应该在这一步设置加密模式等参数,如:

CryptSetKeyParam(hKey, KP_MODE, CRYPT_MODE_CBC, 0);//设置成CBC模式
CryptSetKeyParam(hKey, KP_IV, pbIV, 0);//设置初始向量
BOOL CryptSetKeyParam(
HCRYPTKEY hKey,
DWORD dwParam,
BYTE * pbData,
DWORD dwFlags
)

调用CryptEncrypt进行加密。

BOOL CryptEncrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash, //如果不需要对原数据进行摘要运算可以设为NULL
BOOL Final, //true时表示没有分块加密或当前是最后一块加密,否则为false
DWORD dwFlags, //设置为0
BYTE *pbData, //原文,调用后输出密文
DWORD *pdwDataLen, //要加密原文长度,调用后返回密文长度
DWORD dwBufLen //为pbData分配的缓冲区长度
)

要注意的是,这里的分块和分组加密里的分组是不同的概念,分组是加密算法本身的处理过程,而这里的分块是调用加密功能的业务逻辑,它们处于不同的层面,但分块长度必须是分组长度的整数倍。
在采用分组加密的情况下,密文长度会比明文长度长一些,所以dwBufLen的值应该设置的足够大,以满足返回加密结果的要求。一般的做法是调用两次CryptEncrypt,第一次调用时pbData传NULL,dwBufLen传0,调用后pdwDataLen输出密文所需长度;第二次调用时 dwBufLen设置的值不小于第一次调用后pdwDataLen即可。
调用成功返回true(-1),否则返回false(0),并可以调用GetLastError返回具体错误信息。

对称解密

CryptAcquireContext
CryptCreateHash
CryptHashData
CryptDeriveKey
CryptSetKeyParam

上面的方法与加密的调用顺序和参数设置基本一致,不再赘述。

BOOL CryptDecrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData, //输入密文,调用后输出明文
DWORD *pdwDataLen //输入为密文长度,调用后输出明文长度
)

CryptDecrypt方法调用成功返回true(-1),否则返回false(0),并可以调用GetLastError返回具体错误信息。

对同一数据的加密和解密可以采用不同的分块方式。比如,加密时不分块,解密时分块,不影响最后的解密结果。

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

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

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

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

信息隐藏

信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文。

身份鉴别

安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。

身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。

完整性检测

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

2.PKCS#11

架构

image

会话状态

image

对象

image

以上参考博客:https://www.cnblogs.com/wdys12138/p/17265752.html

使用方式

  1. 初始化PKCS#11库:在程序开始时,需要初始化PKCS#11库。这通常涉及加载PKCS#11库文件和调用相应的初始化函数。

  2. 获取加密设备列表:通过PKCS#11库,可以获取连接到系统上的加密设备列表。

  3. 打开加密设备:选择要使用的加密设备,并通过PKCS#11库打开它。

  4. 登录:如果需要进行身份验证(如PIN码),则需要登录到加密设备中。

  5. 生成密钥或加载现有密钥:可以使用PKCS#11接口来生成新密钥,或者加载现有密钥到加密设备中。

  6. 进行加密和解密操作

    • 加密数据:

      # Initialize encryption mechanism
      mechanism = PKCS11.Mechanism(CKM_AES_CBC, iv)
      
      # Encrypt data
      encrypted_data = session.encrypt(mechanism, encryption_key, plaintext)
      
    • 解密数据:

      # Initialize decryption mechanism
      mechanism = PKCS11.Mechanism(CKM_AES_CBC, iv)
      
      # Decrypt data
      decrypted_data = session.decrypt(mechanism, decryption_key, encrypted_data)
      
  7. 管理对象:可以使用PKCS#11接口来管理对象,如密钥、证书等。

  8. 登出和关闭设备:在使用完加密设备后,要记得登出并关闭设备。

  9. 异常处理:适当处理PKCS#11操作中可能发生的异常,如登录失败、加密失败等。

  10. 测试和验证:对使用PKCS#11的功能进行充分的测试,确保其符合安全需求并且能正确地处理各种情况下的数据。

3.GMT 0016-2012

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

术语和定义

下列术语和定义适用于本文件

应用 application

包括容器、设备认证密钥和文件的一种结构,具备独立的权限管理。

容器container

密码设备中用于保存密钥所划分的唯一性存储空间。

设备device

本标准中将智能密码钥匙统称为设备

设备认证 device authentication智能密码钥匙对应用程序的认证
设备认证密钥 device authentication key用于设备认证的密钥。
设备标签 label
设备的别名,可以由用户进行设定并存储于设备内部。

消息鉴别码 message authentication code; MAC消息鉴别算法的输出。
管理员PIN administrator PIN管理员的口令,为ASCII字符串
用户PIN user PIN
用户的口令,为ASCII字符串。

缩略语
下列缩略语适用于本规范: API 应用编程接口(Application Programming Interface)
PKI 公钥基础设施(Public Key Infrastructure)
PKCS#1
公钥密码使用标准系列规范中的第1部分,定义RSA公开密钥算法加密和签名机制(the Public-Key Cryptography Standard Part 1)
PKCS#5 公钥密码使用标准系列规范中的第5部分,描述一种利用从口令派生出来的安全密
钥加密字符串的方法(the Public-Key Cryptography Standard Part 5)
PIN 个人身份识别码(Personal Identification Number)
MAC 消息鉴别码(Message Authentication Code)

4.GMT 0018-2012

规范性引用文件

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

术语和定义

以下术语和定义活用干本文件
算法标识algorithm ideutifier:用于对密码算法进行唯一标识的符号。

非对称密码算法/公钥密码算法 asymmetric cryptographic algorithm/public key cryptographic algorithm加解密使用不同密钥的密码算法。
解密 decipherment/decryption加密过程对应的逆过程。
设备密钥device key pair
存储在设备内部的用于设备管理的非对称密钥对包含签名密钥对和加密密钥对。

加密encipherment/encryption
对数据进行密码变换以产生密文的过程。

密钥加密密钥key encrypt key;KEK对密钥进行加密保护的密钥。
公钥基础设施public key infrastructure;PKI
用公钥密码技术建立的普遍适用的基础设施,为用户提供证书管理和密钥管理等安全服务。

私钥访问控制码private key access password
用于验证私钥使用权限的口令字。

对称密码技术/对称密码体制 symmetric cryptographic technique
原发者和接收者均采用同秘密密钥进行变换的密码技术(体制)。其中,加密密钥与解密密钥相同或者一个密钥可以从另一个密钥导出的密码体制。

会话密钥session key
处于层次化密钥结构中的最低层,仅在一次会话中使用的密钥。

用户密钥 user key
存储在设备内部的用于应用密码运算的非对称密钥,包含签名密钥对和加密密钥对。

符号和缩略语

下列缩略语适用于本部分:
ECC 椭圆曲线算法(Elliptic Curve Cryptography)
IPK 内部加密公钥(Internal Public Key)
ISK
内部加密私钥(Interal Private Key) EPK
外部加密公钥(Extenal Public Key) KEK 密钥加密密钥(Key Encrypt Key)

三、列出这些API包含的函数,进行分类,并总结它们的异同

1.Crypto API

主要的API

image

密钥的产生和交换函数

image
image

编码/解码函数

image

数据加密/解密函数

image

哈希和数字签名函数

image
image

证书库函数

image

维护函数

image

证书函数

image

证书撤销列表函数

image

2.PKCS#11

连接函数

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:校验一个数字签名

3.GMT 0016-2012

设备管理系列函数

image

访问控制系列函数

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:关闭密码对象句柄

4.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

总结异同

  1. CryptoAPI 提供了一组函数。这些函数允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名。实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行。
  2. PKCS#11为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。
  3. Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。
  4. 国密涉及到了设备的管理,有设备管理接口还有访问控制函数,其API更侧重于设备。

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

1.SKF接口

龙脉密码钥匙驱动实例工具等
image

2.Crypto API

1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln
要在当前目录下先创建 20211115.txt
image
image
image

3.PKCS#11

1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln
(1)DES
image
image
(2)DES3
image
image
(3)RC2
image

image
(4)RC4
image
image
(5)RSA
image
image
(6)AES
image
image
2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln
image

相关代码:

Crypto API#

Copy
解释

HCRYPTPROV hCryptProv;
HCRYPTHASH hCryptHash;
HCRYPTKEY hCryptKey;


CPAcquireContext(
hCryptProv, NULL,
MS_DEF_PROV,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT
)//为应用程序创建一个上下文

CPCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hCryptHash
) //为应用程序创建一个上下文

static char szHash[]=”PISAHASHDATA”; //原始字符串
DWORD dwLen=strlen(szHash);
CPHashData(hCryptHash, (BYTE*)szHash, dwLen, 0);//散列输入的数据
CPDeriveKey(hCryptProv, CALG_RC2, hCryptHash, 0, &hCryptKey);//从一个数据散列中生成一个会话密钥,它保证生成的密钥互不相同

static char szEntry[]= “PISA2002”;
DWORD dwLenIn = strlen(szEntry);
DWORD dwLenOut=dwLenIn;
CPEncrypt(hCryptKey, 0, TRUE, 0, (BYTE*)szEntry, &dwLenOut, dwLenIn);//用来加密明文
CPDecrypt(hCryptKey, 0, TRUE, 0,(BYTE*)szEntry,&dwLenOut);//用来解密先前被加密的数据
CPDestroyKey(hCryptKey);//释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问
CPDestroyHash(hCryptHash);//删除一个散列对象句柄
CPReleaseContext(hCryptProv, NULL);//释放CPAcquireContext.创建的上下文

PKCS#11

CK_SESSION_HANDLE hSession;
CK_MECHANISM digestMechanism;
CK_ULONG ulStateLen;
CK_BYTE data1[] = {0x01, 0x03, 0x05, 0x07};
CK_BYTE data2[] = {0x02, 0x04, 0x08};
CK_BYTE data3[] = {0x10, 0x0F, 0x0E, 0x0D, 0x0C};
CK_BYTE pDigest[20];
CK_ULONG ulDigestLen;
CK_RV rv;

/* Initialize hash operation */
rv = C_DigestInit(hSession, &digestMechanism);//初始化消息杂凑计算操作,指定计算消息杂凑的算法
assert(rv == CKR_OK);

/* Start hashing */
rv = C_DigestUpdate(hSession, data1, sizeof(data1));//对多个分组的消息进行杂凑计算
assert(rv == CKR_OK);//返回成功或者失败

/* Find out how big the state might be */
rv = C_GetOperationState(hSession, NULL_PTR, &ulStateLen);//获取设备是否存在的状态
assert(rv == CKR_OK);//返回成功或者失败

/* Allocate some memory and then get the state */
pState = (CK_BYTE_PTR) malloc(ulStateLen);
rv = C_GetOperationState(hSession, pState, &ulStateLen);//获取设备是否存在的状态

/* Continue hashing */
rv = C_DigestUpdate(hSession, data2, sizeof(data2));//对多个分组的消息进行杂凑计算
assert(rv == CKR_OK);//返回成功或者失败

/* Restore state.  No key handles needed */
rv = C_SetOperationState(hSession, pState, ulStateLen, 0, 0);
assert(rv == CKR_OK);//返回成功或者失败

/* Continue hashing from where we saved state */
rv = C_DigestUpdate(hSession, data3, sizeof(data3));//对多个分组的消息进行杂凑计算
assert(rv == CKR_OK);//返回成功或者失败

/* Conclude hashing operation */
ulDigestLen = sizeof(pDigest);
rv = C_DigestFinal(hSession, pDigest, &ulDigestLen);
if (rv == CKR_OK) {
  /* pDigest[] now contains the hash of 0x01030507100F0E0D0C */
}//返回成功或者失败

SKF接口#

Copy
解释

CK_FLAGS flags = 0;
CK_Dev_ID DevID;
        CK_Dev_INFO DevInfo;


    /* Block and wait for a slot event */
rv = SKF_WaitForSlotEvent(flags, &slotID, NULL_PTR);//等待设备的插拔事件
assert(rv == CKR_OK);//返回成功或者失败

/* See what’s up with that slot */
rv = SKF_GetDevInfo(slotID, &slotInfo);//获取设备的一些特征信息
assert(rv == CKR_OK);//返回成功或者失败

标签:API,SKF,RSA,SDF,引擎,密钥,ECC,加密
From: https://www.cnblogs.com/20211115fyq/p/18125908

相关文章

  • 实验一-密码引擎-加密API的研究
    一、任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交......
  • 加密API研究
    0查找各种标准的原始文档,研究学习(至少包含CryptoAPI,PKCS#11,GMT0016-2012,GMT0018-2012)(5分)(1)CryptoAPICrypto接口提供了当前上下文中可用的基本的加密功能。它允许访问一个密码学安全的随机数生成器和密码学原语(cryptographicprimitive)。WebCryptoAPI可以通过crypto属......
  • 实验一-密码引擎-3-加密API研究
    目录1CryptoAPI1.1五个主要功能区域1.2函数1.2.1基本加密函数1.2.2证书和证书库函数1.2.3证书验证函数1.2.4创建密钥容器2PKCS#112.1函数2.2操作3GM/T0018-20123.1简介3.2范围3.3结构模型3.4函数3.5安全要求3.5.1密钥管理要求3.5.2密码服务......
  • 实验一-密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • 密码引擎API研究与应用
    密码引擎API研究与应用目录一、任务概览二、密码引擎API标准2.1微软CryptoAPI2.2RAS公司PKCS#11标准2.3中国商用密码标准三、应用示例4.1SKF接口示例4.2CryptoAPI示例4.3PKCS#11示例一、任务概览密码引擎API的主要标准和规范包括:1微软的CryptoAPI......
  • 实验一-密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • 实验一-密码引擎-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • 实验一-密码引擎-3-加密API研究
    一、任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提......
  • Apifox 集成,Fast Request 2024.1.4 发布
    RestfulFastRequest是一个类似于Postman的IDEA插件。它是一个强大的restfulapi工具包插件,可以根据已有的方法帮助您快速、自动生成url和params。RestfulFastRequest=API调试工具+API管理工具+API搜索工具。它有一个漂亮的界面来完成请求、检查服务器响......
  • Python快速构建Web API的利器库之Toapi使用详解
      概要Toapi模块是一个强大的Python库,可以帮助开发者快速构建WebAPI。通过Toapi,开发者可以轻松地将网页内容转换为API接口,实现数据的抓取和解析。本文将介绍Toapi模块的基本用法和功能,以及多种Python案例,帮助读者更好地理解和应用Toapi模块。Toapi模块的基本用法Toap......