RSA非对称密码算法的三个创始人的姓的第一个字母联合起来就是RSA了,他们三个创建的公司的名字也就叫做RSA。在RSA有一个著名的公钥算法的实验室,这个实验室颁发的一系列行业标准就称作为PKCS标准,其中PKCS#11(简称P11)就是针对密码设备的接口指令标准。目前最新的版本应该是2.3了。
P11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限。而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象。P11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
PKCS#11创建和支持下列对象:
对象 |
说明 |
CKO_DATA |
应用程序定义的对象。对象的数据结构可由应用程序任意定义,但是数据意义的解释由应用程序负责。 |
CKO_SECRET_KEY |
对称加密算法使用的密钥。 |
CKO_CERTIFICATE |
X.509 |
CKO_PUBLIC_KEY |
RSA |
CKO_PRIVATE_KEY |
RSA |
CKO_MECHANISM |
算法对象 |
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。
PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:一类是公开对象,这类对象是任何用户都可以访问的;另一类是私有对象,这一类对象只有身份被验证的用户才有权访问。决定对象的访问限制类型的模板属性是CKA_PRIVATE。这是个布尔值,所有的对象都有这一属性。应用程序可根据需要决定对象应为私有对象还是公开对象。
P11标准颁发了70余条指令。其中部分指令简介如下表:
接口类型 |
函数名称 |
描述 |
通用接口函数 |
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 |
完成一个多部分摘要操作 | |
签名和消息鉴别函数 |
C_SignInit |
初始化一个签名操作 |
C_Sign |
签名单部分数据 | |
C_SignUpdate |
继续一个多部分签名操作 | |
C_SignFinal |
完成一个多部分签名操作 | |
C_SignRecoverInit |
初始化一个签名操作,在操作中数据能从签名中恢复 | |
C_SignRecover |
签名单部分数据,在操作中数据能从签名中恢复 | |
签名鉴定消息鉴别函数 |
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 |
生成随机数 | |
并行功能管理函数 |
C_GetFunctionStatus |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
C_CancelFunction |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
3、CSP接口标准
CSP接口标准为微软所颁发,在windows操作系统上通行。CSP中重要的概念是容器(container)。一个容器中具有一对公私钥。而证书却是这一对密钥的附加属性了。
CSP总共有23个函数接口。简介如下:
接口类型 |
函数名称 |
描述 |
CSP连接函数 |
CPAcquireContext |
为应用程序创建一个上下文 |
CPGetProvParam |
返回CSP相关的信息 | |
CPReleaseContext |
释放CPAcquireContext创建的上下文 | |
CPSetProvParam |
设置CSP的参数操作 | |
CSP密钥生成和交换函数 |
CPDeriveKey |
从一个数据散列中生成一个会话密钥,它保证生成的密钥互不相同 |
CPDestroyKey |
释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问 | |
CPExportKey |
从CSP容器中导出密钥 | |
CPGenKey |
用来生成密钥或密钥对 | |
CPGenRandom |
使用随机数填充一个缓冲 | |
CPGetKeyParam |
用来得到加密操作密钥的属性 | |
CPGetUserKey |
用来获取CSP容器中的持久密钥对 | |
CPImportKey |
从一个blob中导入密钥到CSP容器中 | |
CPSetKeyParam |
设置密钥的属性 | |
CSP加解密函数 |
CPDecrypt |
用来解密先前被加密的数据 |
CPEncrypt |
用来加密明文 | |
CSP散列和数字签名函数 |
CPCreateHash |
初始化并散列输入数据 |
CPDestroyHash |
删除一个散列对象句柄 | |
CPDuplicateHash |
创建一个散列对象的拷贝 | |
CPGetHashParam |
获取散列对象的计算结果 | |
CPHashData |
散列输入的数据 | |
CPSetHashParam |
定制一个散列对象的属性 | |
CPSignHash |
签名一个散列对象 | |
CPVerifySignature |
校验一个数字签名 |
4、国密接口标准
国家密码管理局在2011年也制定了相关的接口标准,其标准在上层方面借鉴或参考了CSP接口,存在容器的概念,在底层操作上借鉴或参考了P11接口,有对象的标准,同时支持获取相关属性。具体国密局接口标准及其修订情况,请参考国家密码管理局网站