任务内容
研究以上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分)
以下是我的学习链接:https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/cryptoapi-system-architecture#base-cryptographic-functions
https://www.jianshu.com/p/b5a80fe0e901
https://www.doc88.com/p-6911351376514.html
https://v1.cecdn.yun300.cn/150001_2107145025/GMT0018-2012密码设备应用接口规范(1).pdf
https://blog.csdn.net/liuhuiyi/article/details/7778123
https://www.w3.org/TR/WebCryptoAPI/
任务详情
1.API在编程中的使用方式
-
了解API文档:在使用任何API之前,首先需要阅读其文档。文档通常包含了如何配置和使用API的详细指南,包括如何认证、API支持的请求类型、传递参数的方式、响应的数据格式等关键信息。
-
配置认证信息:大多数API,特别是商业API,要求用户进行身份认证以使用其服务。这通常涉及到生成API密钥、设置OAuth令牌等。根据API的要求,将这些认证信息妥善配置到你的请求中。
-
构造请求:根据API文档构造HTTP请求。这包括选择正确的HTTP方法(GET、POST、PUT等)、设置请求头、构造请求体(对于POST和PUT请求)以及设置任何必要的查询参数。
-
处理响应:发送请求后,你将收到API的响应。根据API文档,解析响应体中的数据。这可能涉及到处理JSON或XML格式的数据,提取你需要的信息。
-
错误处理和调试:在使用API的过程中,可能会遇到各种错误,如网络问题、认证失败、请求参数错误等。根据API返回的错误代码和信息,进行相应的错误处理和调试。有时,你可能需要记录请求和响应的详细信息,以便进一步分析问题。
2、基本加密函数
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 |
设备的应用结构
基本数据类型
通用的接口
3. 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客
(三)PKCS#11
1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln
(1)DES
(2)DES3
(3)Rc2
(4)RC4
(5)RSA
(6)AES
龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln
相关代码:
Ⅰ.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 */
}//返回成功或者失败
标签:API,CK,rv,加密,PROV,RSA,引擎,hSession
From: https://www.cnblogs.com/liyishi1110/p/18126092