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

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

时间:2024-04-10 14:45:14浏览次数:19  
标签:11 PKCS rv 加密 函数 引擎 API

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

Crypto API
https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/cryptoapi-system-architecture#base-cryptographic-functions
微软的CryptoAPI是Win32平台下为应用程序开发者提供的数据加密和安全的编码接口。CryptoAPI函数集包含了基本的ASN.1的编码、解码,散列,数据加密和解密,数字证书管理等重要的密码学应用功能。数据的加密、解密支持对称和非对称两类算法。
PKCS#11
https://www.jianshu.com/p/b5a80fe0e901
加密令牌接口标准PKCS#11由RSA Security制定,定义了加密令牌的本机编程接口,例如硬件加密加速器和智能卡。使用JCA和JCE API的现有应用程序可以使用PKCS#11提供程序访问本机PKCS#11令牌。pkcs#11只提供了接口的定义, 不包括接口的实现。
GMT 0016-2012
https://www.doc88.com/p-6911351376514.html
规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。
GMT 0018-2012
https://v1.cecdn.yun300.cn/150001_2107145025/GMT0018-2012密码设备应用接口规范(1).pdf
规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。

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

  • Crypto API
  1. 引入头文件和链接库:

在编程时,需要引入wincrypt.h头文件,并链接到Advapi32.lib库。

  1. 初始化和释放Crypto API:

在使用Crypto API之前,需要初始化和释放Crypto API。可以使用CryptAcquireContext函数初始化Crypto API,并使用CryptReleaseContext函数释放资源。

  1. 选择算法和密钥:

在进行加密或解密操作之前,需要选择合适的算法和密钥。可以使用CryptCreateHash函数创建哈希对象,并使用CryptGenKey函数生成密钥。

  1. 加密和解密操作:

一旦选择了算法和密钥,可以使用相应的函数进行加密和解密操作。常用的加密函数是CryptEncrypt,而解密函数是CryptDecrypt

  1. 释放资源:

在使用完Crypto API后,需要释放相应的资源。可以使用CryptDestroyHash函数释放哈希对象,使用CryptDestroyKey函数释放密钥。

  • PKCS#11
  1. 引入头文件和链接库:

在编程时,需要引入适当的PKCS#11头文件,通常是pkcs11.h。还需要链接到与所使用的PKCS#11库相对应的链接库。

  1. 初始化和释放PKCS#11库:

在使用PKCS#11库之前,需要初始化和释放库。可以使用C_Initialize函数初始化PKCS#11库,并使用C_Finalize函数释放资源。

  1. 查询和初始化令牌:

在使用PKCS#11库时,需要查询和初始化要使用的令牌(如智能卡)。可以使用C_GetSlotList函数查询可用的令牌插槽,然后使用C_OpenSession函数打开会话。

  1. 登录和登出令牌:

在进行操作之前,通常需要登录到令牌。可以使用C_Login函数进行登录,并使用相应的用户PIN码验证身份。完成操作后,可以使用C_Logout函数登出令牌。

  1. 生成密钥和对象:

PKCS#11允许生成密钥和其他对象。可以使用C_GenerateKey函数生成密钥,使用C_CreateObject函数创建其他类型的对象。

  1. 加密和解密操作:

一旦获取了密钥和对象,可以使用相应的函数进行加密和解密操作。通常使用C_Encrypt函数进行加密,C_Decrypt函数进行解密。

  1. 释放资源:

在使用完PKCS#11库后,需要释放相应的资源。可以使用C_CloseSession函数关闭会话,使用C_Finalize函数释放PKCS#11库资源。

  • GMT 0016-2012
  • GMT 0018-2012

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

  • Crypto API
  1. 基本加密函数
    用于连接到 CSP 的上下文函数。 这些函数使应用程序能够按名称选择特定的 CSP,或选择可以提供所需功能类别的特定 CSP。
    用于生成和存储加密密钥的密钥生成函数。 包括对更改 链接模式、 初始化向量和其他加密功能的完全支持。
    用于交换或传输密钥的密钥交换函数。
  2. 证书编码/解码函数
    用于加密或解密数据的函数。 还支持对数据进行哈希处理 。
  3. 证书存储函数
    用于管理数字证书集合的函数。
  4. 简化的消息函数
    用于加密和解密消息与数据的函数。
    用于对消息和数据进行签名的函数。
    用于验证所接收消息和相关数据上签名的真实性的函数。
  5. 低级别消息函数
    用于执行简化消息函数执行的所有任务的函数。 与简化的消息函数相比,低级别消息函数提供更大的灵活性,但需要更多的函数调用。
    https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/cryptography-functions
  • PKCS#11
    通用接口
    image

槽和令牌管理
image
会话管理
image
对象管理
image
加密函数
image
解密函数
image
消息摘要
image
签名和MAC
image
验证签名和MAC
image
密钥管理
image
随机数生成
image

  • GMT 0016-2012
    image
    image
    image
    image
    image
    image

  • GMT 0018-2012
    image
    image
    image
    image
    image
    image

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

(一)SKF接口

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

image

(二)Crypto API

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

image
image
image

(三)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);//返回成功或者失败

标签:11,PKCS,rv,加密,函数,引擎,API
From: https://www.cnblogs.com/1104dd/p/18125013

相关文章

  • 实验一-密码引擎-3-加密API研究
    实验一-密码引擎-3-加密API研究一、查找各种标准的原始文档,研究学习(至少包含CryptoAPI,PKCS#11,GMT0016-2012,GMT0018-2012)1.CryptoAPI微软的CryptoAPI是PKI推荐使用的加密API。功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。Cry......
  • 实验一-密码引擎-加密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搜索工具。它有一个漂亮的界面来完成请求、检查服务器响......