实验一-密码引擎-加密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密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。
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通用接口
2.2槽和令牌管理
2.3会话管理
2.4对象管理
2.5加密函数
2.6解密函数
2.7消息摘要
2.8签名和MAC
2.9验证签名和MAC
2.10密钥管理
2.11随机数生成
差异:
Crypto API与PKCS#11
CryptoAPI是通过容器来组织密钥。一个容器可以存放两个RSA密钥对,一个用于签名验证,一个用于加解密。此外每个用户在加密对话其间还会随机产生许多会话密钥。
PKCS#11没有容器概念,它对密钥数据的保存和组织主要通过对象。p11定义了三种对象类型:数据对象,证书对象和密钥对象。
在CryptoAPI中的证书和证书库函数对应着PKCS#11中槽和令牌管理函数,其中CryptoAPI中多了证书库回调函数,可以进行返回操作。
相同:
肯定要有最基本的加解密函数,以及签名和验证函数,以及证书的管理函数、密钥管理函数、信息处理函数。