加载中…
个人资料
_恬11_
_恬11_
  • 博客等级:
  • 博客积分:0
  • 博客访问:12,614
  • 关注人气:7
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

CSP和PKCS#11

(2016-05-05 09:24:11)
分类: 計算機零零總總
CSP和PKCS#11的关系

一、引言 

   PKI,被誉为现代信息社会安全的基石,它能够为所有网络透明地提供加密和数字签名等密码服务所需的密钥和证书管理功能,能够提供认证、访问控制、数据完整性机密性、和不可否认性等核心安全服务。由于PKI提供了良好的安全平台,全球很对单位都开发了各种PKI软硬件密码设备。但不同单位的加密接口不尽相同,为用户开发和设备无关的加密应用带来不便。为了解决加密接口问题,目前已经形成了多种API国际标准,其中PKI推荐使用的API标准主要有:Intel CDSARSA PKCS#11Microsoft CryptoAPI(CSP).

二、CSPP11简介

   这里,我们主要说说微软的CSP和RSAP11接口标准。

CSP接口标准:

   微软的加密应用接口,专为WIN32应用程序设计的。CryptoAPI本身不实现密码运算相关操作,而是操作系统通过调用CryptoSPI函数接口相应的加密服务提供者函数(CSP)来实现。

    CSP的主要概念为:容器(key Container),sessionkey,hashobject.

P11接口标准

    RSA实验室开发的,有跨平台的特性。是PKCS的一部分,特指密码设备的因公编程接口,PKCS#11标准称为CryptoKi,是一个较底层的编程接口。

    P11的主要概念是:令牌、会话、槽和对象。

三、二者的区别:

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

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

    相比较而言,CSP比较简单,只有23个函数,当然它能够实现的功能就相对简单一点。可以作为入门。


PKCS#11及CSP接口标准

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接口,有对象的标准,同时支持获取相关属性。具体国密局接口标准及其修订情况,请参考国家密码管理局网站

0

阅读 评论 收藏 禁止转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有