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

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

0. 查找各种标准的原始文档,研究学习

  • Crypto API:可以查阅Microsoft官方文档中关于Crypto API的介绍和使用方式。
  • PKCS#11:可以查阅RSA公司发布的PKCS#11标准文档,详细了解其定义和规范。
  • GMT 0016-2012和GMT 0018-2012:可以查阅中国商用密码标准的相关文档,包括智能密码钥匙密码应用接口规范和密码设备应用接口规范。

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

  • Crypto API:在Windows平台上,可以使用Crypto API进行各种密码学操作,如加密、解密、数字签名等。需要包含wincrypt.h头文件,通过一系列函数调用完成操作。

  • CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。CryptoAPI的体系结构。
    目前支持CryptoAPI的Windows系统有:Windows 95 OSR2、Windows NT SP3及后续版本、Windows 98、Windows 2000等。CryptoAPI的配置信息存储在注册表中,包括如下密钥:
    HKEY_LOCAL_MACHINE\SOFTWARE
    Microsoft Cryptography Defaults
    HKEY_CURRENT_USER Software Microsoft
    Cryptography Providers2.数据加密原理
    微软的CryptoAPI是PKI推荐使用的加密 API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographic service provider)之间。
    CryptoAPI的编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。
    CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
    CSP是真正实行加密的独立模块,他既可以由软件实现也可以由硬件实现。但是他必须符合CryptoAPI接口的规范。每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,这样便于CryptoAPI找到对应的CSP。目前已经有9种CSP类型,并且还在增长。下表列出出它们支持的密钥交换算法、签名算法、对称加密算法和Hash算法。

  • PKCS#11:PKCS#11是一个密码设备通信标准,用于与硬件安全模块(HSM)等密码设备进行通信。需要包含pkcs11.h头文件,通过调用PKCS#11库中的函数进行操作。PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
    PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
    PKCS#11主要是应用于智能卡和HSM。
    PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
    Cryptoki:Cryptographic Token Interface Standard 密码令牌接口标准,应用程序与各种各样便携式密码设备间的一种接口。设备的种类和所支持的能力的种类取决于专用的Cryptoki库。该标准只定义库的接口,不定义库的实现,接口实现由设备商提供。Cryptoki主要目标是一个低级程序接口,将设备的细节抽象化,并把密码设备的通用模型-密码令牌提供给应用程序。第二目标是资源共享,单个设备能为一个以上的应用程序共享。Cryptoki为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行,密码设备可以按照某一命令集执行某些密码操作,这些命令通常通过标准的设备驱动程序来实现,Cryptoki的作用就是屏蔽这些硬件的差异。





  • GMT 0016-2012和GMT 0018-2012:这两个中国商用密码标准定义了智能密码钥匙和密码设备的接口规范,具体使用方式需要根据标准文档进行实现。

  • 设备管理类函数:
    A打开设备:SDF_OpenDevice
    B关闭设备:SDF_CloseDevice
    C创建会话:SDF_OpenSession
    D关闭会话:SDF_CloseSession
    E获取设备信息:SDF_GetDeviceInfo
    F产生随机数:SDF_GenerateRandom
    G获取私钥使用权限:SDF_GetPrivateKeyAccessRight
    H释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
    密钥管理类函数
    A导出RSA签名公钥:SDF_ExportSignPublicKey_RSA
    B导出RSA加密公钥:SDF_ExportEncPublicKey_RSA
    C产生RSA非对称密钥对并输出:SDF_GenerateKeyPair_RSA
    D生成会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK_RSA
    E生成会话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_RSA
    F导入会话密钥并用内部RSA私钥解密:SDF_ImportKeyWithISK_RSA
    G基于RSA算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnRSA
    H导出ECC签名公钥:SDF_ExportSignPublicKey_ECC
    I导出ECC加密公钥:SDF_ExportEncPublicKey_ECC
    J产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ECC
    K生成会话密钥并用内部ECC公钥加密输出:SDF_GenerateKeyWithIPK_ECC
    L生成会话密钥并用外部ECC公钥加密输出:SDF_GenerateKeyWithEPK_ECC
    M导入会话密钥并用内部ECC私钥解密:SDF_ImportKeyWithISK_ECC
    N生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
    O计算会话密钥:SDF_GenerateKeyWithECC
    P产生协商数据并计算会话密钥:SDF_GenerateAgreementDataAndKeyWithECC
    Q基于ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
    R生成会话密钥并用密钥加密密钥加密输出:SDF_GenerateKeyWithKEK
    S导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
    T销毁会话密钥:SDF_DestroyKey
    非对称算法运算类函数:
    A外部公钥RSA运算:SDF_ExternalPublicKeyOperation_RSA
    B内部公钥RSA运算:SDF_InternalPublicKeyOperation_RSA
    C内部私钥RSA运算:SDF_InternalPrivateKeyOperation_RSA
    D外部密钥ECC验证:SDF_ExternalVerify_ECC
    E内部密钥ECC签名:SDF_InternalSign_ECC
    F内部密钥ECC验证:SDF_InternalVerify_ECC
    G外部密钥ECC加密:SDF_ExternalEncrypt_ECC
    对称算法运算类函数:
    A对称加密:SDF_Encrypt
    B对称解密:SDF_Decrypt
    C计算MAC:SDF_CalculateMAC
    用户文件操作类函数
    A创建文件:SDF_CreateFile
    B读取文件:SDF_ReadFile
    C写文件:SDF_WriteFile
    D删除文件:SDF_DeleteFile

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

  • Crypto API:包含函数如CryptAcquireContextCryptGenKeyCryptEncrypt等,用于密钥管理、加密解密操作。提供了丰富的加密算法支持。
  • PKCS#11:包含函数如C_InitializeC_GenerateKeyC_Encrypt等,主要用于与密码设备进行通信和操作。提供了跨平台的密码设备接口。
  • GMT 0016-2012和GMT 0018-2012:具体函数需要查阅标准文档,一般包括与智能密码钥匙和密码设备相关的初始化、密钥管理、加密解密等函数。

3. 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API, PKCS#11,SKF接口)

  • Crypto API示例代码:
#include <windows.h>
#include <wincrypt.h>

int main() {
    HCRYPTPROV hCryptProv;
    if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
        // 使用Crypto API进行加密解密等操作
        CryptReleaseContext(hCryptProv, 0);
    }
    return 0;
}
  • PKCS#11示例代码:
#include "pkcs11.h"

// 示例:使用PKCS#11列出可用的槽位
void ListSlots() {
    CK_FUNCTION_LIST_PTR pFunctionList;
    CK_C_GetFunctionList(&pFunctionList);
    CK_SLOT_ID_PTR pSlotList;
    CK_ULONG ulSlotCount;
    CK_RV rv;

    rv = pFunctionList->C_Initialize(NULL_PTR);
    if (rv == CKR_OK) {
        rv = pFunctionList->C_GetSlotList(CK_TRUE, NULL_PTR, &ulSlotCount);
        if (rv == CKR_OK && ulSlotCount > 0) {
            pSlotList = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID) * ulSlotCount);
            rv = pFunctionList->C_GetSlotList(CK_TRUE, pSlotList, &ulSlotCount);
            // 槽位信息现在存储在pSlotList中
            free(pSlotList);
        }
        pFunctionList->C_Finalize(NULL_PTR);
    }
}

  • SKF接口示例代码:(SKF是国产密码设备接口标准)
#include <skf.h>

int main() {
    HANDLE hDev;
    if (SKF_ConnectDev("GM3000Key", &hDev) == SAR_OK) {
        // 使用SKF接口进行加密解密等操作
        SKF_DisconnectDev(hDev);
    }
    return 0;
}

以上是对密码引擎API主要标准和规范的详细回答,希望能帮助到您。如果有任何其他问题或需求,请随时告诉我。

要详细回答这个问题,我们首先需要查找和研究各种密码引擎API的原始文档,然后基于这些资料,我们能够总结API的使用方式,列出并分类它们包含的函数,并且讨论它们的异同。最后,我们将以龙脉GM3000Key为例,展示如何使用这些不同的接口。由于我无法直接提供最新的外部链接或访问外部数据库,我会基于我训练时的知识给出一个大致的指导。

1. 查找各种标准的原始文档

  • 微软的Crypto API: 可以在微软的官方文档网站上找到,特别是在Windows开发者文档部分。
  • PKCS#11标准: 它是由RSA实验室发布的,公开的标准文档通常可以在OASIS网站或者RSA实验室的官方网站上找到。
  • 中国商用密码标准GMT 0016-2012和GMT 0018-2012: 这些标准的文档可以在中国国家密码管理局网站或者通过相关的商用密码产品供应商获取。

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

  • 微软Crypto API: 主要用于Windows平台,提供了一套用于加密、哈希操作、数字签名等的函数库。它通过提供加密服务提供者(CSP)来实现具体的加密算法。需要包含wincrypt.h头文件,通过一系列函数调用完成操作。

  • PKCS#11标准: 是一种设备无关的API,用于访问加密令牌如智能卡和HSM(硬件安全模块)。它定义了一套用于加密、解密、签名、验证等操作的通用API接口。需要包含pkcs11.h头文件,通过调用PKCS#11库中的函数进行操作。

  • 中国商用密码标准(GMT 0016-2012, GMT 0018-2012): 这些标准定义了智能密码钥匙和密码设备的应用接口规范,主要用于中国的商用密码领域,提供了加密、解密、密钥管理等功能。

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

  • Crypto API:包含函数如CryptAcquireContextCryptGenKeyCryptEncrypt等,用于密钥管理、加密解密操作。提供了丰富的加密算法支持。
  • PKCS#11:包含函数如C_InitializeC_GenerateKeyC_Encrypt等,主要用于与密码设备进行通信和操作。提供了跨平台的密码设备接口。
  • GMT 0016-2012和GMT 0018-2012:具体函数需要查阅标准文档,一般包括与智能密码钥匙和密码设备相关的初始化、密钥管理、加密解密等函数。

加密/解密: 所有API都提供了加密和解密的基本功能,但实现的算法和方法可能会有所不同,比如Crypto API和PKCS#11支持多种国际算法,而GMT标准支持中国商用密码算法。

密钥管理: 包括密钥生成、导入、导出等,这是密码应用中最重要的部分之一。PKCS#11和GMT标准在密钥管理方面提供了更为丰富的接口。

数字签名和验证: 这也是所有API共有的功能,用于数据的完整性和身份验证。

4. 以龙脉GM3000Key为例,写出调用不同接口的代码

1、SKF接口

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

2、Crypto API

a、在以下目录先创建txt文件后,打开:

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



b、打开以下文件:

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

3、PKCS#11

a、打开以下文件:

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






posted @ 2024-04-09 08:43  风雾里  阅读(30)  评论(0编辑  收藏  举报