任务详情
0.查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
1.总结这些API在编程中的使用方式
2.列出这些API包含的函数,进行分类,并总结它们的异同
3.以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),4.把运行截图加入博客,并提供代码链接
0.研究学习原始文档
CryptoAPI
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptography-portal
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptoapi-system-architecture
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptographic-provider-types
https://docs.microsoft.com/en-us/windows/win32/seccrypto/microsoft-cryptographic-service-providers
https://docs.microsoft.com/en-us/windows/win32/seccng/cng-portal
https://docs.microsoft.com/zh-cn/windows/win32/api/wincrypt/
PKCS#11
GM/T 0016-2012 智能密码钥匙密码应用接口规范
GM/T 0018-2012 密码设备应用接口规范
http://www.gmbz.org.cn/main/bzlb.html
1.总结这些API在编程中的使用方式
API 描述
CryptoAPI 微软的CryptoAPI是PKI推荐使用的加密API,为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI共有五部分组成,包括简单消息函数、低层消息函数、基本加密函数、证书编解码函数和证书库管理函数。这些函数可用于敏感信息的加密、签名以及网络传输的私有性和认证性保障。
PKCS#11 Cryptoki为应用程序与各种密码设备(如智能卡、PCMCIA卡)之间提供接口。它将密码设备的细节抽象化,提供通用的密码令牌模型。Cryptoki通过槽和令牌的逻辑视图连接应用程序与密码设备,支持数据、证书和密钥的存储与管理。
SKF SKF是针对支持国密算法USB KEY设备的应用而制定的行业标准。它提供智能密码钥匙应用接口规范,使开发的应用程序兼容不同厂家及品牌的USB KEY产品。SKF库或SKF接口按照规范提供设备开发接口。
CryptoAPI的编程模型类似于Windows系统的图形设备接口GDI。加密服务提供者CSP相当于图形设备驱动程序,加密硬件(可选)相当于图形硬件。CryptoAPI提供简单消息函数、低层消息函数、基本加密函数、证书编解码函数和证书库管理函数,用于加密、签名和网络传输的安全保障。
PKCS#11
Cryptoki将密码设备抽象为通用的密码令牌模型,通过槽和令牌的逻辑视图连接应用程序与密码设备。支持数据、证书和密钥的存储与管理,为应用程序提供安全的密码操作接口。
SKF
SKF是智能密码钥匙应用接口规范的实现,支持国密算法USB KEY设备的应用开发。它提供设备认证密钥和多个应用之间的独立性,支持管理员PIN、用户PIN、文件和容器的管理,以及加密密钥对、签名密钥对和会话密钥的存储与管理。
2.列出这些API包含的函数,进行分类,并总结它们的异同
CryptoAPI提供了一系列函数用于密码服务提供者(CSP),这些函数用于连接或断开CSP、枚举计算机上的CSP、获取或设置默认CSP以及获取或设置CSP参数。具体函数包括:
连接CSP函数 CryptAcquireContext:用于连接CSP,获取指定CSP的密钥容器的句柄。
断开CSP函数 CryptReleaseContext:用于断开CSP连接,释放CSP句柄,与 CryptAcquireContext 相对应。
枚举CSP函数 CryptEnumProviders:用于枚举计算机上的所有CSP,可以循环调用以获取所有可用的CSP。
获得默认CSP函数 CryptGetDefaultProvider:用于获取系统默认的CSP。
设置默认CSP函数 CryptSetProvider:用于设置系统默认的CSP。
获得CSP参数属性函数 CryptGetProvParam:用于获取CSP各种参数属性。
设置CSP参数函数 CryptSetProvParam:用于设置CSP各种参数属性。
密钥的生成与交换方面的函数包括:
生成密钥函数 CryptGenKey:用于产生一个随机的对称或非对称算法的密钥。
派生密钥函数 CryptDeriveKey:根据基础数据派生一对称密钥。
销毁密钥函数 CryptDestroyKey:用于销毁密钥。
复制密钥函数 CryptDuplicateKey:用于复制一个密钥。
导出密钥函数 CryptExportKey:用于从CSP导出密钥或密钥对。
导入密钥函数 CryptImportKey:用于将BLOB数据导入CSP。
获得密钥参数函数 CryptGetKeyParam:用于获得key句柄的各项参数。
设置密钥参数函数 CryptSetKeyParam:用于设置key句柄的各项参数。
产生随机数函数 CryptGenRandom:用于生成随机数。
数据的加密与解密方面的函数包括:
数据加密函数 CryptEncrypt:用于使用指定的密钥和算法加密数据。
数据解密函数 CryptDecrypt:用于解密加密数据。
哈希和数字签名方面的函数包括:
创建哈希函数 CryptCreateHash:用于创建哈希。
销毁哈希函数 CryptDestroyHash:用于销毁哈希对象。
复制哈希函数 CryptDuplicateHash:用于复制一个哈希对象。
获得哈希参数函数 CryptGetHashParam:用于获得哈希对象的参数。
设置哈希参数函数 CryptSetHashParam:用于设置哈希对象的参数。
哈希数据函数 CryptHashData:用于对数据进行哈希操作。
对哈希签名函数 CryptSignHash:用于对哈希对象进行签名。
对哈希验证签名函数 CryptVerifySignature:用于验证哈希签名。
证书和证书库方面的函数包括:
打开证书库函数 CertOpenStore:用于打开证书库。
关闭证书库函数 CertCloseStore:用于关闭证书库。
从证书库枚举证书函数 CertEnumCertificatesInStore:用于枚举证书库中的证书。
从证书库查找证书函数 CertFindCertificateInStore:用于从证书库中查找指定的证书。
创建证书句柄函数 CertCreateCertificateContext:用于由证书数据创建证书句柄。
释放证书句柄函数 CertFreeCertificateContext:用于释放证书句柄。
获得证书句柄属性函数 CertGetCertificateContextProperty:用于获得证书句柄属性。
设置证书句柄属性函数 CertSetCertificateContextProperty:用于设置证书句柄属性。
获得证书主题名称函数 CertGetNameString:用于从证书中获得主题或颁发者的名称。
PKCS#11(Cryptographic Token Interface Standard,Cryptoki)函数及其用途:
通用目的函数:
C_Initialize: 初始化 Cryptoki。
C_Finalize: 整理各种适合 Cryptoki 的资源。
C_GetInfo: 获得关于 Cryptoki 的通用信息。
C_GetFunctionList: 获得 Cryptoki 库函数的进入点。
槽和令牌管理函数:
C_GetSlotList: 获得系统中槽的名单。
C_GetSlotInfo: 获得关于特殊槽的信息。
C_GetTokenInfo: 获得关于特殊令牌的信息。
C_WaitForSlotEvent: 等待槽事件(如令牌插入、转移等)的发生。
C_GetMechanismList: 获得由令牌支持的机制的名单。
C_GetMechanismInfo: 获得关于特殊机制的信息。
C_InitToken: 初始化一个令牌。
C_InitPIN: 初始化普通用户的 PIN。
C_SetPIN: 改变现在用户的 PIN。
会话管理函数:
C_OpenSession: 打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入。
C_CloseSession: 关闭一个会话。
C_CloseAllSessions: 用令牌关闭所有的会话。
C_GetSessionInfo: 获得关于会话的信息。
C_GetOperationState: 获得会话的加密操作状态。
C_SetOperationState: 设置会话的加密操作状态。
C_Login: 注册一个令牌。
C_Logout: 从一个令牌注销。
对象管理函数:
C_CreateObject: 建立一个对象。
C_CopyObject: 建立一个对象的拷贝。
C_DestroyObject: 销毁一个对象。
C_GetObjectSize: 获取字节中一个对象的大小。
C_GetAttributeValue: 获取一个对象的属性值。
C_SetAttributeValue: 改变一个对象的属性值。
C_FindObjectsInit: 初始化一个对象的搜索操作。
C_FindObjects: 继续一个对象搜索操作。
C_FindObjectsFinal: 完成一个对象搜索操作。
加密函数:
C_EncryptInit: 初始化一个加密操作。
C_Encrypt: 加密单部分数据。
C_EncryptUpdate: 继续一个多部分加密操作。
C_EncryptFinal: 完成一个多部分加密操作。
解密函数:
C_DecryptInit: 初始化一个解密操作。
C_Decrypt: 解密单部分加密数据。
C_DecryptUpdate: 继续一个多部分解密操作。
C_DecryptFinal: 完成一个多部分解密操作。
消息摘要函数:
C_DigestInit: 初始化一个消息摘要操作。
C_Digest: 摘要单部分数据。
C_DigestUpdate: 继续一个多部分摘要操作。
C_DigestKey: 摘要一个密钥。
C_DigestFinal: 完成一个多部分摘要操作。
签名和MACing:
C_SignInit: 初始化一个签名操作。
C_Sign: 签名单部分数据。
C_SignUpdate: 继续一个多部分签名操作。
C_SignFinal: 完成一个多部分签名操作。
C_SignRecoverInit: 初始化一个签名操作,在操作中数据能从签名中恢复。
C_SignRecover: 签名单部分数据,在操作中数据能从签名中恢复。
验签和MACs:
C_VerifyInit: 初始化一个鉴定操作。
C_Verify: 在单部分数据上鉴定一个签名。
C_VerifyUpdate: 继续一个多部分鉴定操作。
C_VerifyFinal: 完成一个多部分鉴定操作。
C_VerifyRecoverInit: 初始化一个鉴定操作,在操作中数据能从签名中恢复。
C_VerifyRecover: 在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复。
双重目的的加密:
C_DigestEncryptUpdate: 继续类似的多部分摘要和加密操作。
C_DecryptDigestUpdate: 继续类似的多部分解密和摘要操作。
C_SignEncryptUpdate: 继续类似的多部分签名和加密操作。
C_DecryptVerifyUpdate: 继续类似的多部分解密和鉴定操作。
密钥管理函数:
C_GenerateKey: 产生一个保密密钥。
C_GenerateKeyPair: 产生一对公开/私有密钥。
C_WrapKey: 封装(即加密)一个密钥。
C_UnwrapKey: 解开(即解密)一个封装的密钥。
C_DeriveKey: 派生一个密钥。
随机数生成函数:
C_SeedRandom: 产生种子值。
C_GenerateRandom: 产生随机数据。
SKF(Software Key Management)函数及其用途:
设备管理:
SKF_EnumDev: 枚举设备。
SKF_ConnectDev: 连接设备。
SKF_DisConnectDev: 断开设备。
访问控制:
SKF_Login: 用户登录。
SKF_Logout: 用户登出。
应用管理:
SKF_CreateApplication: 创建应用。
SKF_DeleteApplication: 删除应用。
SKF_EnumApplication: 枚举应用。
SKF_OpenApplication: 打开应用。
SKF_CloseApplication: 关闭应用。
文件管理:
SKF_CreateFile: 创建文件。
SKF_DeleteFile: 删除文件。
SKF_EnumFiles: 枚举文件。
SKF_ReadFile: 读取文件。
SKF_WriteFile: 写入文件。
容器管理:
SKF_CreateContainer: 创建容器。
SKF_DeleteContainer: 删除容器。
SKF_EnumContainer: 枚举容器。
密码服务:
SKF_GenRandom: 生成随机数。
SKF_GenRSAKeyPair: 生成 RSA 密钥对。
SKF_ImportRSAKeyPair: 导入 RSA 密钥对。
SKF_RSAPubEncrypt: RSA 公钥加密。
SKF_RSAPriDecrypt: RSA 私钥解密。
SKF_RSASignData: RSA 签名数据。
SKF_RSAVerify: RSA 验证签名。
SKF_RSAPubDerive: RSA 公钥派生。
SKF_GenECCKeyPair: 生成 ECC 密钥对。
SKF_ImportECCKeyPair: 导入 ECC 密钥对。
SKF_ECCSignData: ECC 签名数据。
SKF_ECCVerify: ECC 验证签名。
3.以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
1. EncryptDecryptFile
插入usbkey
使用visual studio 2019(我的版本)打开E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile目录下的Encryptfile.sln文件
由于项目兼容性问题,在VS2019中看不到项目代码属于正常现象,不影响操作
点击编译,出现如下界面
我在桌面新建了一个文件夹与相对应的txt文件,路径为:C:\Users\86530\Desktop\test\blog.txt
将这个路径输入到调试窗口中
按照相应指示完成操作:
期间遇到未响应或长时间不执行下一步时,返回VS2019界面点击绿色三角继续,然后输入usbkey的密码123456即可
输入output文件的路径时,需要注意只输入文件名时,默认保存在这个代码的项目路径下,我为了省事直接输入文件名了,假如需要保存到txt文件的目录下,仍旧需要输入绝对路径
可以在txt文件的目录下发现一个新文件encode,如下所示
2.DecryptFile
保持usbkey链接
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\DecryptFile.vcproj"
点击调试
按照如下方式输入相应的信息和加密时用的password,前后要一致:
可以在txt文件的目录下发现解密后的文件,记事本打开后可以看到加解密都是正常的:
EnumCerts
枚举证书
保持usbkey链接
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts\EnumCerts.sln"
点击调试后一直点继续,直到退出程序为止。
输出的结果根据每个用户的PC环境不同会有所区别
Sign_Verify
保持usbkey链接,打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify\Signa_Verify.sln"
同样是输入usbkey的密码后点击继续即可
PKCS#11
需要使用win32编译
由于我的visual studio 2019的MFC环境配置出现严重错误,难以执行,因此换用了配置过MFC环境的PC进行步骤
EnumObj
Exportcert
public key object
private key object
GetUSBInfos
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln"直接执行即可
PKCSDemo
RSA Sign
RSA Verify
RSA Encrypt
RSA Decrypt
PKCStest
SKF
DevAuth
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\DevAuth\DevAuth.sln",点击执行即可
EncryptData
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln"输入口令即可
RemoteUnblock
打开"E:\龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\RemoteUnblock\RemoteUnblock.sln"点击执行
Signature
标签:加密,函数,证书,SKF,实验,密钥,20211208,CSP From: https://www.cnblogs.com/gmj666/p/18127369