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

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

密码引擎API的主要标准和规范包括:

1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

研究以上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分)

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

1.CryptoAPI

CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥PFX代码签名等等。CryptoAPI的体系结构。

CryptoAPI 的组成

CryptoAPI由简单消息函数(Simplified Message Functions)、低层消息函数(Low-level MessageFunctions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate EncodelDecode Functions)和证书库管理函数(Certificate Store Functions)5部分组成。其中前三者可用于对敏感信息进行加密或签名处理,从而保证网络传输信息的保密、防篡改、防抵赖等;后两者是对证书的操作,实现身份的认证。

2.PKCS#11

PKCS#11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API,并将API本身命名为“Cryptoki”(来自“加密令牌接口”,发音为“crypto-key” - 但是“PKCS#11”通常用于指代API以及定义它的标准)。 API定义了最常用的加密对像类型(RSA密钥,X.509证书,DES / 三重DES密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。

https://www.doc88.com/p-3939101431520.html?r=ref-https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D771YU21q-5I8k_Y2F4bwPSskryTnctDFbPCYq6l4SobgzjCES1WamTa-oi2w3OSWKBCLvzdBjptU1eqRyO3skK%26wd%3D%26eqid%3D9aeb057e0005ecd2000000026073aede

3.GMT 0016-2012

http://www.gmbz.org.cn/main/viewfile/20180110020423162671.html

4.GMT 0018-2012

http://www.gmbz.org.cn/main/viewfile/20180110020642562680.html

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

1.CryptoAPI

1.1密码服务提供者 CSP函数

CryptoAPI 的密码服务提供者函数主要包括6个函数。连接或断开 CSP函数CryptAcquireContext、CryptReleaseContext,枚举CSP函数 CryptEnumProviders,获得或设置默认CSP函数CryptGetDefaultProvider、CryptSetProvider,获取或设置CSP参数函数CryptGetProvParam、CryptSetProvParam。

连接CSP函数CryptAcquireContext

函数功能:连接CSP,获得指定CSP的密钥容器的句柄。函数定义:

BOOL WINAPI CryptAcquireContext(HCRYPTPROV *phProv,
LPCTSTR pszContainer,
LPCTSTRpszProvider,
DWORD.dwProvType,
DWORD dwFlags);

参数说明:
phProv: [OUT] CSP句柄指针。
pszContainer:[IN]密钥容器名称,指向密钥容器的字符串指针。如果dwFlags为CRYPTVERIFYCONTEXT,pszContainer必须为NULL。
pszProvider:[IN]指向CSP名称的字符串指针。如果为NULL,就使用默认的 CSP。dwProvType:[IN] CSP类型。

枚举CSP函数CryptEnumProviders
BOOL WINAPI CryptEnumProviders(
DWORD dwIndex,
DWORD *pdwReserved,
DWORD dwFlags,
DWORD *pdwProvType,
LPTSTR pSzProvName,
DWORD *pcbProvName);

参数说明:
dwIndex:[IN]枚举下一个CSP的索引。
pdwReserved:[IN]保留参数,必须为NULL。pdwProvType:[OUT] CSP的类型。
pszProvName:[OUT]指向接收CSP名称的缓冲区字符串指针。pcbProvName:[IN/OUT]指出pszProvName字符串的大小。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以使用GetLastError()函数获得错误码。

获得默认CSP函数CryptGetDefaultProvider
BOOL WINAPI CryptGetDefaultProvider (
DWORD dwProvType,
DWORD *pdwReserved,
DWORD dwFlags,
LPTSTR pszProvName,
DWORD *pcbFrovName
};

参数说明:
dwProvType:[IN] CSP类型。
pdwReserved:. [IN]保留参数,必须为NULL。dwFlags:[IN]标志位。
pszProvName: [OUT] 指向接收CSP名称的缓冲区字符串指针。pcbProvName: [IN/OUT]指出pszProvName字符串的大小。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过 GetLastError()函数获得错误码。

设置默认CSP函数CryptSetProvider
BOOL WINAPI CryptsetProvider(
LPCTSTRpszProvName,
DWORD dwProvType
};

参数说明:
dwProvType:[IN]CSP类型。
pszProvName:[IN]CSP名称的缓冲区字符串指针。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

获得CSP参数属性函数CryptGetProvParam
BOOL WINAPI CryptGetProvParam(
HCRYPTPROV hProv,
DWORD dwParam,
BYTE *pbData,
DWORD *pdwDataLen,DWORD dwFlags
};

参数说明:
hProv:[IN] CSP句柄。
dwParam:[IN]指定查询的参数。可选择的值和意义如表13.2所示。

pbData:[OUT] 指向接收数据的缓冲区指针。
pdwDataLen: [IN/OUT]指出pbData数据长度。
dwFlags:[IN]标志位。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastErrorO)函数获得错误码。

设置CSP参数函数CryptSetProvParam
BOOL WINAPI CryptSetProvParam(
HCRYPTPROV hProv,
DWORD dwParam,
BYTE *pbData,
DWORD dwFlags
};

hProv: [IN] CSP句柄。
dwParam:[IN]指定设置的参数。可选择的值和意义如表所示。

pbData:[IN]指向设置数据的缓冲区指针。dwFlags:[IN]标志位。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

断开CSP函数 CryptReleaseContext

BOOL WINAPT CryptReleaseContext(
HCRYPTPROV hProv,
DWORDdwFlags
);
参数说明:
hProv :[IN] CSP句柄。
dwFlags: [IN]标志位,保留参数,必须为0。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastErrorO)函数获得错误码。

1.2密钥的产生和交换函数

CryptoAPI密钥产生和交换函数主要有生成密钥函数 CryptGenKey、派生密钥函数
CryptDeriveKey、销毁密钥函数CryptDestoryKey、夏制出钥图效 TypLDupalcaeKey、Vuuot四数CryptExportKey、导入密钥函数CryptImportKey、获得密钥参效函效UrypietKeyraran、以且密钥参数函数 CryptSetKeyParam、产生随机函数 CryptGenRandom。

生成函数 CryptGenKey

BOOL WINAPI CryptGenKey (
HCRYPTPROV hProv,
ALG_ID Algid,
DWORD dwFlags,
HCRYPTKEY *phKey
);
参数说明:
phProv:[IN] CSP句柄指针。
Algid:[IN]密码算法标示。Algid支持的参数如表14.1所示。

dwFlags: [IN]标志位,指定生成密钥的参数,如对称密钥的长度,RSA密钥的长度。phKey:[OUT] 新产生的密钥句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以使用GetLastError()函数获得错误码。

派生密钥函数CryptDeriveKey

函数功能:根据基础数据派生一对称密钥(会话密钥)。

BOOL WINAPI CryptDeriveKey (
HCRYPTPROV hProv,
ALG ID Algid,
HCRYPTHASH hBaseData,
DWORD dwFlags,
HCRYPTKEY *phKey
};

参数说明:
phProv: [IN] CSP句柄指针。Algid:[IN]密码算法标识。
hBaseData:[IN]基础数据的摘要句柄。dwFlags:[IN]标志位。
phKey: [IN/OUT] 新产生的会话密钥句柄。

销毁密钥函数CryptDestroyKey
BOOL WINAPI Crypt DestroyKey (
HCRYPTKEY hKey
);

hKey:[IN]密钥句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

复制密钥函数CryptDuplicateKey

函数功能:复制一个密钥。产生一个密钥的铂贝,包括其状态。

BOOL WINAPI Crypt DuplicateKey(
HCRYPTKEY hKey,
DWORD *pdwReservea,
DWORD dwFlags,
HCRYPTKEY *phKey
);

参数说明:
hKey:[IN]密钥句柄。
pdwReserved:[IN]保留参数,必须为NULL。dwFlags:[IN]保留参数,必须为0。
phKey:[OUT]复制后的密钥句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以使用GetLastError()函数获得错误码。

导出密钥函数CryptExportKey

函数功能:从 CSP导出密钥或密钥对。函数定义:

BOOL WINAPICryptExportKey (
HCRYPTKEY hKey,版
HCRYPTKEY hExpKey,
DWORD dwBlobType,DWORD dwFlags,
BYTE*pbData,
DWORD *pdwDataLen
);

hKey:[IN] 密钥句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

导入密钥函数CryptlmportKey

函数功能:把 BLOB数据导入的CSP。该函数可以导入会话密钥、公钥、或者公/私钥对。
函数定义:

BOOL WINAPI Crypt ImportKey(
HCRYPTPROV hProv,
BYTE *pbData,
DWORD dwDataLen,HCRYPTKEY hPubKey,DWORD dwFlags,
HCRYPTKEY *phKey);

参数说明:
hProv:[IN] CSP句柄。pbData: [IN] BLOB数据。
dwDataLen:[IN] BLOB数据长度。
hPubKey:[N]此函数的意义根据CSP的类型以及导入的BLOB数据的类型不同而不同。如果BLOB 数据是由交换密钥加密的,该参数就是交换密钥的句柄。
如果BLOB数据是由会话密钥加密的,该参数就是会话密钥的句柄。如果BLOB数据没有被加密,则该参数为NULL。
dwFlags:[IN]标志位。
phKey:[IN]导入密钥的句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

1.3数据的加密和解密函数

CryptoAPI利用CryptEncrypt函数实现数据加密,利用CryptDecrypt实现数据解密。调用这2个函数前必须指定一个密钥,这个密钥可以由 CryptGenKey、CryptDeriveKey或CryptImportKey产生。也可用CryptSetKeyParam函数指定额外的加密参数。

数据加密函数CryptEncrypt

函数功能:使用hKey 指定的密钥和算法加密数据。函数定义:

BOOL WINAPI CryptEncrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,BOOL Final,
DWORD dwFlags,BYTE *pbData,
DWORD *pdwDataLen,DWORD dwBufLen
);

参数说明:
hKey:[IN]密钥句柄。该句柄指定了加密的密钥和算法。
hHash:[IN] HASH对象的句柄。如果数据需要同时被哈希和加密,hHash则指定了哈希对象。
您队爱
Final:[IN]指出是否是最后一次加密操作。
dwFlags:[IN]保留参数。
pbData:[IN/OUT]作为输入参数为被加密数据的缓冲区指针,其长度由dwBufLen指定。作为输出参数为加密后的数据缓冲区指针,其长度由pdwDataLen指定。此函数会把pbData数据加密后的结果覆盖到pbData缓冲区中。
pdwDataLen:[OUT] 加密后的数据长度。
dwBufLen:[IN]被加密数据的长度。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

数据解密函数CryptDecrypt

函数功能:使用hKey指定的密钥和算法对加密数据解密。函数定义:

BOOL WINAPI Crypt Decrypt (
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen
);

参数说明:
hKey:[IN]密钥句柄。该句柄指定了解密的密钥和算法。
hHash: [IN HASH对象的句柄。如果数据需要同时被解密和哈希,hHash则指定了哈希对象。
Final:[IN]指出是否是最后一次解密操作。时深个欢国药dwFlags:[IN]保留参数。
pbData: [IN/OUT]作为输入参数为被解密数据的缓冲区指针,其长度由pdwDataLen指定。作为输出参数为解密后的明文数据缓冲区指针,其长度由pdwDataLen 指定。此函数会把pbData数据解密后的结果覆盖到pbData缓冲区中。
pdwDataLen:[IN/OUT]解密前为被解密数据长度,解密后为明文数据长度。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过 GetLastError()函数获得错误码。

1.4哈希和数字签名函数

CryptoAPI提供的哈希和数字签名函数包括创建哈希函数CryptCreateHash、销毁哈希CryptDestroyHash、复制哈希函数CryptDuplicateHash、获得哈希参数函数CryptGetHashParam、设置哈希参数函数CryptSetHashParam、哈希会话密钥函数CryptHashSessionKey、哈希数据函数CryptHashData、对哈希签名函数CryptSignHash和对哈希验证签名函数CryptVerifySignature.

创建哈希函数CryptCreateHash

函数功能:创建哈希。函数定义:

BOOL WINAPI CryptCreateHash(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,DWORD dwFlags,
HCRYPTHASH *phHash
);

参数说明:
hProv: [IN] CSP句柄。Algid:[IN指定哈希算法。
hKey: [N]如果哈希算法是密钥哈希,如HMAC或 MAC算法,就用此密钥句柄传递密钥。对于非密钥算法,此参数为NULL。
dwFlags:[IN]保留参数。
phHash:[OUT] 输出的哈希对象指针。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

销毁哈希CryptDestroyHash
BOOL WINAPI CryptDestroyHash (
HCRYPTHASH hHash
);

参数说明:
hHash:[IN]哈希对象句柄。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过GetLastError()函数获得错误码。

复制哈希函数CryptDuplicateHash

函数功能:复制一个哈希对象。
函数定义:

BOOL WINAPI CryptDuplicateHash(
HCRYPTHASH hHash,
DWORD *pdwReserved,DWORD dwFlags,
HCRYPTHASH *phHash);

参数说明:
hHash:[IN]哈希对象句柄。
pdwReserved:[IN]保留参数,必须为0。dwFlags:[IN]保留参数。
phHash:[OUT]输出的哈希对象句柄指针。
返回值:操作成功返回TRUE,否则返回FALSE。出错可以通过 GetLastError()函数获得错误码。

1.5证书和证书库函数

CryptoAPI 证书和证书库函数主要包括打开证书库函数 CertOpenStore、关闭证书库函数CertCloseStore、从证书库枚举证书函数 CertEnumCertificatesInStore、从证书库查找证书函数CertFindCertificateInStore、创建证书句柄函数 CertCreateCertificateContext、释放证书句柄函数CertFreeCertificateContext、获得证书句柄属性函数CertGetCertificateContextProperty、设置证书句柄属性函数CertSetCertificateContextProperty 和获得证书主题名称函数CertGetNameString.

打开证书库函数CertOpenStore

函数功能:根据证书库类型,打开证书库。函数定义:

HCERTSTORE WINAPI CertOpenstore(
LPCSTR 1pszStoreProvider,
DWORD dwMsgAndCertEncodingType,HCRYPTPROV hCryptProv,
DWORD dwFlags,
const void *pvPara
};

参数说明:
lpszStoreProvider:[IN]指定证书库的类型。可选参数如表17.1所示
dwMsgAndCertEncodingType:[N]指定证书的编码类型,通常为X509_ASN_ENCODINGPKCS 7_ASN_ ENCODING。

关闭证书库函数 CertCloseStore

函数功能:关闭证书库。函数定义:
BOOL WINAPI CertCloseStore(
HCERTSTORE hCertStore,
DWORD dwFlags
);
参数说明:
hCertStore: [IN]证书库句柄。
dwFlags:[IN]标志位。可选的参数如表17.3所示。
输入图片说明
返回值:操作成功返回TRUE,否则返回NULL。出错可以使用GetLastError()函数获得错误码。

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

1.CryptoAPI

1.1基本加密函数

基本加密函数为开发加密应用程序提供了足够灵活的空间。所有CSP 的通讯都是通过这些函数。

一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作。

如果使用多于一个以上的CSP,在加密函数调用中就要指定所需的CSP。微软基本加密提供者(Microsoft Base Cryptographic Provider),是缺省绑定到CryptoAPI 里的。如果没有指定其他CSP 时,这个CSP 就是却省的。

每一个CSP 对CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,而其他一些CSP 包含了对硬件的支持,比如智能卡。另外,一些CSP 偶尔和使用者直接通讯,比如数字签名就使用了用户的签名私钥。

基本加密函数包含了以下几种:

服务提供者函数:应用程序使用服务提供者函数来连接和断开一个CSP。下面就是主要的API

CryptAcquireContext 获得指定CSP 的密钥容器的句柄
CryptContextAddRef 对HCRYPTPROV 句柄增加一个应用计数
CryptEnumProviders 枚举当前计算机中的CSP
CryptEnumProviderTypes 枚举CSP 的类型
CryptGetDefaultProvider 对于指定CSP 类型的却省CSP
CryptGetProvParam 得到一个CSP 的属性
CryptInstallDefaultContext 安装先前得到的HCRYPTPROV 上下文作为当前却省的上下文
CryptReleaseContext 释放由CryptAcquireContext 得到的句柄
CryptSetProvider 和CryptSetProviderEx 为指定CSP 类型指定一个却省的CSP
CryptSetProvParam 指定一个CSP 的属性
CryptUninstallDefaultContext 删除先前由CryptInstallDefaultContext 安装的却省上下文

密钥的产生和交换函数:密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:

CryptAcquireCertificatePrivateKey 对于指定证书上下文得到一个HCRYPTPROV 句柄和dwKeySpec
CryptDeriveKey 从一个密码中派生一个密钥
CryptDestoryKey 销毁密钥
CryptDuplicateKey 制作一个密钥和密钥状态的精确复制
CryptExportKey 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中
CryptGenKey 创建一个随机密钥
CryptGenRandom 产生一个随机数
CryptGetKeyParam 得到密钥的参数
CryptGetUserKey 得到一个密钥交换或签名密钥的句柄
CryptImportKey 把一个密钥BLOB 传送到CSP中
CryptSetKeyParam 指定一个密钥的参数

编码/解码函数:有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。以下就是这几个函数:

CryptDecodeObject 对lpszStructType 结构进行解码
CryptDecodeObjectEx 对lpszStructType 结构进行解码,此函数支持内存分配选项
CryptEncodeObject 对lpszStructType 结构进行编码
CyptEncodeObjectEx 对lpszStructType 结构进行编码,此函数支持内存分配选项

数据加密/解密函数:这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。

CryptDecrypt 使用指定加密密钥来解密一段密文
CryptEncrypt 使用指定加密密钥来加密一段明文
CryptProtectData 执行对DATA_BLOB 结构的加密
CryptUnprotectData 执行对DATA_BLOB 结构的完整性验证和解密

哈希和数字签名函数:这些函数在应用程序中完成计算哈希、创建和校验数字签名。

CryptCreateHash 创建一个空哈希对象
CryptDestoryHash 销毁一个哈希对象
CryptDuplicateHash 复制一个哈希对象
CryptGetHashParam 得到一个哈希对象参数
CryptHashData 对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey 对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam 设置一个哈希对象的参数
CryptSignHash 对一个哈希对象进行签名
CryptVerifySignature 校验一个数字签名

1.2证书和证书库函数

这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。这些函数可以分成一下几组:

证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。

以下就是这些函数:

CertAddStoreToCollection 在证书库中增加一个证书
CertCloseStore 关闭一个证书库句柄
CertControlStore 如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知
CertDuplicateStore 通过增加引用计数来复制证书库句柄
CertEnumPhysicalStore 对于指定系统库枚举物理库
CertEnumSystemStore 枚举所有可用的系统库
CertEnumSystemStoreLocation 枚举可用系统库的所有位置
CertGetStoreProperty 得到一个库的属性
CertOpenStore 使用指定库类型来打开证书库
CertOpenSystemStore 打开一个系统证书库
CertRegisterPhysicalStore 在一个注册系统库里增加一个物理库
CertRegisterSystemStore 注册一个系统库
CertRemoveStoreFromCollection 从一个库集合里删除证书库
CertSaveStore 保存证书库
CertSetStoreProperty 设置证书属性
CertUnregisterPhysicalStore 从系统库中删除一个物理库
CertUnregisterSystemStore 反注册一个指定系统库

维护函数:CryptoAPI 提供了证书和证书库函数如下:

CertAddSerializeElementToStore 在库中增加一系列证书或CRL
CertCreateContext 从编码字节中创建指定上下文
CertEnumSubjectInSortedCTL 在CTL 库中枚举信任主题
CertFindSubjectInCTL 在CTL 中寻找指定主题
CertFindSubjectInSortedCTL 在分类CTL 中寻找指定主题

证书函数:下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。

CertAddCertificateContextToStore 在证书库里增加一个证书上下文
CertAddCertificateLinkToStore 在证书库里增加一个对不同库里的证书上下文的链接
CertAddEncodedCertificateToStore 把编码证书转换成证书上下文并且把它加到证书库里
CertCreateCertificateContext 从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里
CertCreateSelfSignCertificate 创建一个自签名证书
CertDeleteCertificateFromStore 从证书库里删除一个证书
CertDuplicateCertificate 通过增加引用计数来复制证书上下文
CertEnumCertificateInStore 在证书库里枚举证书上下文
CertFindCertificateInStore 在证书库里寻找证书上下文
CertFreeCertificateContext 释放一个证书上下文
CertGetIssuerCertificateFromStore 在证书库里得到指定主题证书的发行者
CertGetSubjectCertificateFromStore 获得主题证书的上下文
CertGetValidUsages 返回所有证书的用法
CertSerializeCertificateStoreElement 串行化编码证书的证书上下文
CertVerifySubjectCertificateContext 使用发行者来验证主题证书
CryptUIDlgViewContext 显示证书、CRL 或CTL
CryptUIDlgSelectCertificateFromStore 从指定库中显示对话框,可以从中选择证书

证书撤销列表函数:

CertAddCRLContextToStore 在证书库里增加一个CRL 上下文
CertAddCRLLinkToStore 在不同的库里增加一个CRL 上下文链接
CertAddEncodedCRLToStore 把编码CRL 转化成CRL 上下文然后把它加入到证书库中
CertCreateCRLContext 从编码CRL 中创建CRL 句柄,但不把它加到库中
CertDeleteCRLFromStore 从证书库里删除一个CRL
CertDuplicateCRLContext 通过增加引用计数来复制CRL 上下文
CertEnumCRLsInStore 枚举库里的CRL 句柄
CertFindCertificateInCRL 从指定证书里寻找CRL 列表
CertFindCRLInStore 在库里寻找CRL 上下文
CertFreeCRLContext 释放CRL 上下文
CertGetCRLFromStore 从库里得到CRL 上下文句柄
CertSerializeCRLStoreElement 串行化CRL 上下文的编码CRL 和它的属性

证书信任列表函数:

CertAddCTLContextToStore 把一个CTL 上下文加入到证书库里
CertAddCTLLinkToStore 给不同库里的CRL 上下文添加链接
CertAddEncodedCTLToStore 把编码CTL 转化成CTL 上下文并且把它加到证书库里
CertCreateCTLContext 从编码CTL 中创建CTL 上下文
CertDeleteCTLFromStore 从证书库里删除CTL
CertDuplicateCTLContext 通过增加引用计数来复制CTL 上下文
CertEnumCTLsInStore 在证书库里枚举CTL 上下文
CertFindCTLInStore 在证书库里查找CTL 上下文
CertFreeCTLContext 释放CTL 上下文
CertSerializeCTLStoreElement 串行化CTL 上下文的编码CTL 和属性

扩展属性函数:

CertEnumCertificateContextProperties 枚举指定证书上下文的属性
CertEnumCRLContextProperties 枚举指定CRL 上下文的属性
CertEnumCTLContextProperties 枚举指定CTL 上下文的属性
CertGetCertificateContextProperty 得到证书属性
CertGetCRLContextProperty 得到CRL 属性
CertGetCTLContextProperty 得到CTL 属性
CertSetCertificateContextProperty 设置证书属性
CertSetCRLContextProperty 设置CRL 属性
CertSetCTLContextProperty 设置CTL 属性

1.3证书验证函数

证书验证是通过CTL 和证书列表进行的。

使用CTL 的函数:

CertVerifyCTLUsage 验证CTL 用法
CryptMsgEncodeAndSignCTL 编码和验证CTL
CryptMsgGetAndVerifySigner 从一个消息中获得和验证CTL
CryptMsgSignCTL 对包含CTL 的消息进行签名

证书链验证函数:

CertCreateCertificateChainEngine 为应用程序创建一个新的非却省的链引擎
CertCreateCTLEntryFromCertificateContextProperties 创建一个CTL 入口
CertDuplicateCertificateChain 通过增加引用计数来复制证书链
CertFindChainInStore 在证书库里查找证书链
CertFreeCertificateChain 释放证书链
CertFreeCertificateChainEngine 释放证书链引擎
CertGetCertificateChain 从最后一个证书建立一个上下文链表
CertSetCertificateContextPropertiesFromCTLEntry 通过CTL 入口属性来设置证书上下文的属性
CertIsValidCRLForCertificate 通过检查CRL 来确定CRL 是否包括指定被撤销的证书
CertVerifyCertificateChainPolicy 通过检查证书链来确定它的完整性

1.4消息函数

CryptoAPI 消息函数包括两组:低级消息函数和简化消息函数。

低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。

简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。

低级消息函数:

CryptMsgCalculateEncodedLength 计算加密消息的长度
CryptMsgClose 关闭加密消息的句柄
CryptMsgControl 执行指定的控制函数
CryptMsgCountersign 标记消息中已存在的签名
CryptMsgCountersignEncoded 标记已存在的签名
CryptMsgDuplicate 通过增加引用计数来复制加密消息句柄
CryptMsgGetParam 对加密消息进行编码或者解码后得到的参数
CryptMsgOpenToDecode 打开加密消息进行解码
CryptMsgOpenToEncode 打开加密消息进行编码
CryptMsgUpdate 更新加密消息的内容
CryptMsgVerifyCountersignatureEncoded 验证SignerInfo 结构中标记时间
CryptMsgVerifyCountersignatureEncodedEx 验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构

简化消息函数:

CryptDecodeMessage 对加密消息进行解码
CryptDecryptAndVerifyMessageSignature 对指定消息进行解密并且验证签名者
CryptDecryptMessage 解密指定消息
CryptEncryptMessage 加密指定消息
CryptGetMessageCertificates 返回包含消息的证书和CRL 的证书库
CryptGetMessageSignatureCount 返回签名消息的签名者数量
CryptHashMessage 创建消息的哈希
CryptSignAndEncryptMessage 对消息进行签名并且加密
CryptSignMessage 对消息进行签名
CryptVerifyDetachedMessageHash 验证包含已解邦定哈希的哈希消息
CryptVerifyDetachedMessageSignature 验证包含已解邦定签名的签名消息
CryptVerifyMessageHash 验证一个哈希消息
CryptVerifyMessageSignature 验证一个签名消息

1.5辅助函数

数据管理函数

CertCompareCertificate 比较两个证书是否相同
CertCompareCertificateName 通过比较两个证书名称来决定他们是否相同
CertCompareIntegerBlob 比较两个整数BLOB
CertComparePublicKeyInfo 通过比较两个证书公钥来决定他们是否相同
CertFindAttribute 通过OID 来查找属性
CertFindExtension 通过OID 来查找扩展
CertFindRDNAttr 通过OID 来查找RDN 属性
CertGetIntendedKeyUsage 从证书中取得相关密钥用法
CertGetPublicKeyLength 从公钥BLOB 中取得公钥/私钥长度
CertIsRDNAttrsInCertificateName 通过指定RDN 数组属性比较证书名称属性来决定证书是否已包含了所有属性
CertVerifyCRLRevocation 验证主题证书是否在CRL 中
CertVerifyCRLTimeValidity 验证CRL 的有效时间
CertVerifyRevocation 验证主题证书是否在CRL 中
CertVerifyTimeValidity 验证CRL 的有效时间
CertVerifyValidityNesting 验证主题时间的有效性是否在发行者有效时间内
CryptExportPublicKeyInfo 导出公钥信息
CryptExportPublicKeyInfoEx 导出公钥信息(用户可以指定算法)
CryptFindCertificateKeyProvInfo 枚举CSP 和它的密钥容器来查找对应于公钥的相应私钥
CryptFindLocalizedName 查找指定名字的局部化名称
CryptHashCertificate 哈希证书内容
CryptHashPublicKeyInfo 计算公钥信息的哈希
CryptHashToBeSigned 计算签名内容的信息哈希值
CryptImportPublicKeyInfo 把公钥信息导入CSP 并且返回它的句柄
CryptImportPublicKeyInfoEx 把公钥信息导入CSP 并且返回它的句柄
CryptMemAlloc 分配内存
CryptMemFree 释放内存
CryptMemRealloc 重新分配内存
CryptQueryObject 得到BLOB 或文件的内容信息
CryptSignAndEncodeCertificate 对信息进行签名并且编码
CryptSignCertificate 对证书进行签名
CryptVerifyCertificateSignature 使用公钥信息对主题证书或CRL 的签名进行验证
CryptVerifyCertificateSignatureEx 使用公钥信息对主题证书或CRL 的签名进行验证

数据转换函数

CertAlgIdToOID 把CSP 算法标示符转换成OID
CertGetNameString 得到证书的主题或颁发者名称并且把它转换成字符串
CertNameToStr 把证书名称BLOB 转换成字符串
CertOIDToAlgId 把OID 转换成CSP 算法表示符
CertRDNValueToStr 把名称值转换成字符串
CertStrToName 把字符串转换成编码证书名称
CryptBinaryToString 把二进制序列转换成字符串
CryptFormatObject 格式化编码数据,返回Unicode 字符串
CryptStringToBinary 把格式化的字符串转换成二进制序列

增强密钥用法函数

CertAddEnhancedKeyUsageIdentifier 在证书EKU 属性中增加一个用法标示符
CertGetEnhancedKeyUsage 获得证书的EKU 扩展或属性信息
CertRemoveEnhancedKeyUsageIdentifier 从证书EKU 扩展属性中删除用法标示符OID
CertSetEnhancedKeyUsage 设置证书的EKU 属性

密钥标示函数

CryptCreateKeyIdentifierFromCSP 创建CSP 公钥的密钥标示符
CryptEnumKeyIdentifierProperties 枚举标示符和其属性
CryptGetKeyIdentifierProperty 从指定密钥标示符中获得指定属性
CryptSetKeyIdentifierProperty 设置指定密钥标示符的属性

证书库回调函数

CertDllOpenStoreProv 定义库提供者打开函数
CertStoreProvCloseCallback 决定当证书库引用计数为0 时将发生的动作
CertStoreProvDeleteCertCallback 决定当从证书库中删除一个证书之前的动作
CertStoreProvDeleteCRLCallback 决定当从证书库中删除一个CRL 之前的动作
CertStoreProvReadCertCallback 保留
CertStoreProvReadCRLCallback 保留
CertStoreProvSetCertPropertyCallback 决定在CertSetCertificateContextProperty 和CertGetCertificateContext 调用之前的动作
CertStoreProvSetCRLPropertyCallback 决定在CertSetCRLContextProperty 和CertGetCRLContextProperty 调用之前的动作
CertStoreProvWriteCertCallback 决定在证书库中加入一个证书前的动作
CertStoreProvWriteCRLCallback 决定在证书库中加入一个CRL 前的动作
CertStoreProvReadCTL 读CSP 的CTL 上下文
CertStoreProvWriteCTL 决定CTL 是否可被加入到证书库中
CertStoreProvDeleteCTL 决定CTL 是否可被删除
CertStoreProvSetCTLProperty 决定是否可以设置CTL 的属性
CertStoreProvControl 当缓冲库和存储库不同时,通知应用程序
CertStoreProvFindCert 在证书库中查找下一个证书
CertStoreProvFreeFindCert 释放前一个找到的证书上下文
CertStoreProvGetCertProperty 得到指定的证书属性
CertStoreProvFindCRL 查找第一个或下一个匹配的CRL
CertStoreProvFreeFindCRL 释放前一个找到的CRL 上下文
CertStoreProvGetCRLProperty 得到指定CRL 属性
CertStoreProvFindCTL 查找第一个或下一个匹配的CTL
CertStoreProvFreeFindCTL 释放前一个找到的CTL 上下文
CertStoreProvGetCTLProperty 得到指定CTL 属性

OID 支持函数

CryptEnumOIDFuction 枚举由编码类型、函数名和OID 指定注册的OID 函数
CryptEnumOIDInfo 枚举注册的OID 信息
CryptEnumOIDInfo 使用指定的密钥和组查找OID 信息
CryptFreeOIDFuctionAddress 释放OID 函数地址句柄
CryptGetDefaultOIDDllList 对于指定的函数结合和类型获得却省注册的DLL 入口
CryptGetDefaultOIDFuctionAddress 获得已安装的第一次或下一个却省函数或者加载包含却省函数的DLL
CryptGetOIDFuctionAddress 搜索匹配指定编码类型和OID 函数列表,如果没有找到,就查找注册表
CryptGetOIDFuctionValue 获得指定编码类型、函数名称和OID 的值
CryptInitOIDFuctionSet 初始化OID 函数集合的句柄
CryptInstallOIDFuctionAddress 安装可调用的OID 函数地址集合
CryptRegisterDefaultOIDFuction 注册包含却省函数的DLL
CryptRegisterOIDFuction 注册包含指定函数的DLL
CryptRegisterOIDInfo 注册由CRYPT_OID_INFO 指定的OID 信息
CryptSetOIDFuctionValue 设置编码类型、函数名称等的值
CryptUnregisterDefaultOIDFunction 卸载包含却省函数的DLL
CryptUnregisterOIDFuction 卸载包含函数的DLL
CryptUnregisterOIDInfo 卸载指定OID 的信息

远程对象恢复函数

CryptGetObjectUrl 从证书、CTL 或CRL 中取得远程对象的URL
CryptRetrieveObjectByUrl 由URL 指定位置恢复PKI 对象

PFX 函数

PFXExportCertStore 从证书库中导出证书或证书和私钥
PFXExportCertStoreEx 从证书库中导出证书或证书和私钥
PFXImportCertStore 从PFX BLOB 导入到指定证书库
PFXIsPFXBlob 把外层BLOB 像pfx 包那样解码
PFXVerifyPassword 把外层BLOB 像pfx 包那样解码,并且用指定口令解密 From: http://blog.csdn.net/zougangx/article/details/8147770

2.PKCS#11

主要的接口函数

2.1通用接口

img

2.2槽和令牌管理

img

2.3会话管理

img

2.4对象管理

img

2.5加密函数

img

2.6解密函数

img

2.7消息摘要

img

2.8签名和MAC

img

2.9验证签名和MAC

img

2.10密钥管理

img

2.11随机数生成

img

差异:

Crypto API与PKCS#11

CryptoAPI是通过容器来组织密钥。一个容器可以存放两个RSA密钥对,一个用于签名验证,一个用于加解密。此外每个用户在加密对话其间还会随机产生许多会话密钥。

PKCS#11没有容器概念,它对密钥数据的保存和组织主要通过对象。p11定义了三种对象类型:数据对象,证书对象和密钥对象。

在CryptoAPI中的证书和证书库函数对应着PKCS#11中槽和令牌管理函数,其中CryptoAPI中多了证书库回调函数,可以进行返回操作。

相同:

肯定要有最基本的加解密函数,以及签名和验证函数,以及证书的管理函数、密钥管理函数、信息处理函数。

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

3.1 Crypto API

3.2 PKCS#11

3.3 SKF接口

码云链接:

posted @ 2022-05-12 16:30  djx20191313  阅读(342)  评论(0编辑  收藏  举报