论文部分内容阅读
数字签名是非对称密钥加密技术与数字摘要技术的应用。所谓数字签名(Digital Signature),又称公钥数字签名、电子签章,是一种使用了公钥加密领域的技术实现、用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。使用数字签名技术,接收方能够核实发送者对报文的签名,发送者事后不能抵赖其对报文的签名,且其他人无法伪造对报文的签名。数字签名保证了传输信息的完整性、发送者的身份验证和不可抵赖性。
按照数字签名流程,签名一条消息涉及到两个步骤。第一步,从发送的消息原文得到一个散列值,即报文摘要。然后使用发送者的私钥来签名这个散列值。把得到的签名数据和消息原文一起发送给接收方,便于接收方进行验证。
数字签名验证流程,为了验证一个签名,需要从发送方得到消息原文和签名数据。首先用相同的算法得到散列值,然后用发送方的公钥对数字签名进行解密,最后比较散列值和签名解密后的数据,如果相同便可以确认此签名是来自发送方的,并且在发送传输过程中未被篡改。
微软CryptoAPI
微软CryptoAPI(Microsoft Cryptographic Application Programming Interface)是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。微软CryptoAPI是一组数目众多的安全函数,这些安全函数是Windows操作系统的一部分。CryptoAPI对密码函数进行抽象,隐藏了实现的细节。
CryptoAPI的上层是应用程序,下层是加密服务提供者(Cryptographic Service Provider,CSP),CSP是真正执行加密功能的独立模块。
1.CryptoAPI体系结构
CryptoAPI由简单消息函数、底层消息函数、基本加密函数、证书编解码函数和证书库管理函数共五部分组成,包含有100多个库函数。其中前三种函数接口用于处理信息加解密和数字签名,后两种函数主要针对证书验证身份的操作。CryptoAPI便是通过一系列的库函数来对应用程序提供PKI安全服务的,其总体系统结构如图1所示。
2.加密服务提供者(CSP)
加密服务提供者(CSP)是真正执行加密功能的独立模块,它实现了那些可以通过CryptoAPI公共接口访问的密码函数。换言之,CSP封装和隐藏了密码算法的具体实现,这样用户就不需要去关心它。典型的CSP有Microsoft Base Cryptographic Provider、Microsoft RSA Base Provider等。
每个CSP都有一个名字和一个类型。为了便于CryptoAPI找到对应的CSP,每个CSP的名字都是惟一的。微软预定义的CSP类型目前有PROV_RSA_AES 、PROV_RSA_SIG 、PROV_DSS 等10种,分别支持不同的密钥交换算法、签名算法、对称加密算法和Hash算法。
每个CSP都有一个密钥库(Key Database),里面存储着算法密钥。每个密钥库都包含一个或多个密钥容器(Key Container),每个密钥容器中保存有属于一个特定用户的所有密钥对。每个用户通常有两对公私钥对,一对用来加密会话密钥,一对用来创建数字签名。每个密钥容器都被赋予一个惟一的名字,这个名字是程序要获得此容器句柄时传递给函数CryptAcquireContext的参数。
用CryptoAPI实现基于USBKEY的数字签名
按照使用CryptoAPI进行数字签名的一般流程,对数据进行签名,首先要创建一个密钥容器(或指定使用一个现有的CSP密钥容器),以便存储密钥和进行以后的工作。然后从密钥容器当中取得密钥对,导出公钥发给接收者用来验证签名,私钥用于签名。接着便可以创建一个Hash对象,先散列要签名的数据,最后便可以对此Hash数据进行签名了。其签名过程图解如图2所示。
对数据签名进行验证,首先也需要创建一个密钥容器(或指定一个现有的CSP密钥容器),以便存储密钥和进行以后的工作。然后从发送者那得到的公钥,导出公钥句柄用来验证签名。接着便可以创建一个Hash对象,先散列原始消息的数据,最后由散列值,公钥句柄和签名便可验证此签名了。
1.USB KEY简介
USB KEY是一种USB接口的硬件设备,它内置单片机或智能卡芯片,有一定的存储空间,主要用于保存数字证书和用户私钥。通过USB KEY生产厂商开发的驱动程序,还可以完成数据加解密、签名验证等功能。
但因为各个厂商开发的驱动接口程序没有统一的标准,用户针对某一型号USB KEY接口函数开发的加解密/签名应用程序,在更换不同厂家型号的USB KEY之后一般无法正常使用,还需要重新再次开发,作者在实际工作中就遇到了这种情况。经过调研后发现,各USB KEY生产厂商一般都会提供符合微软CryptoAPI标准的CSP中间件,用于硬件USB KEY的应用开发。换言之,如果使用CryptoAPI标准函数,就可以开发出通用的、兼容各USB KEY生产厂商CSP中间件的加解密/签名应用程序。
2.实现过程
第一步要获得硬件USB KEY对应的CSP名称。为了获取与USB KEY对应的CSP密钥容器操作句柄,必须首先知道该CSP的惟一名称。获取的途径有两种:一是在安装硬件USB KEY生产厂商提供的驱动程序时,安装程序会将该USB KEY对应的CSP名称、类型、对应的动态链接库(DLL)等信息写入系统注册表中。第二种方法就是使用函数 CryptEnumProviders,通过枚举的方式获得。第二步就是代码实现,限于篇幅,在此不再赘述。
微软CryptoAPI是PKI推荐使用的加密API,它隐藏了具体密码算法的实现细节,程序员利用该接口可以开发出安全的应用程序或产品,而无需太多密码学方面的背景知识。但使用CryptoAPI编程时需要了解CryptoAPI的系统结构以及CryptoAPI与CSP的关系。在实现某个函数功能时,还需调用很多其他的相关函数,且每个函数的参数较多,使用起来比较复杂。
作者在工作中,用CryptoAPI实现了某系统中基于硬件USB KEY的通用数字签名。即用同一段代码,实现了兼容不同种类硬件USB KEY的通用数字签名程序,希望能给大家以帮助。
按照数字签名流程,签名一条消息涉及到两个步骤。第一步,从发送的消息原文得到一个散列值,即报文摘要。然后使用发送者的私钥来签名这个散列值。把得到的签名数据和消息原文一起发送给接收方,便于接收方进行验证。
数字签名验证流程,为了验证一个签名,需要从发送方得到消息原文和签名数据。首先用相同的算法得到散列值,然后用发送方的公钥对数字签名进行解密,最后比较散列值和签名解密后的数据,如果相同便可以确认此签名是来自发送方的,并且在发送传输过程中未被篡改。
微软CryptoAPI
微软CryptoAPI(Microsoft Cryptographic Application Programming Interface)是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。微软CryptoAPI是一组数目众多的安全函数,这些安全函数是Windows操作系统的一部分。CryptoAPI对密码函数进行抽象,隐藏了实现的细节。
CryptoAPI的上层是应用程序,下层是加密服务提供者(Cryptographic Service Provider,CSP),CSP是真正执行加密功能的独立模块。
1.CryptoAPI体系结构
CryptoAPI由简单消息函数、底层消息函数、基本加密函数、证书编解码函数和证书库管理函数共五部分组成,包含有100多个库函数。其中前三种函数接口用于处理信息加解密和数字签名,后两种函数主要针对证书验证身份的操作。CryptoAPI便是通过一系列的库函数来对应用程序提供PKI安全服务的,其总体系统结构如图1所示。
2.加密服务提供者(CSP)
加密服务提供者(CSP)是真正执行加密功能的独立模块,它实现了那些可以通过CryptoAPI公共接口访问的密码函数。换言之,CSP封装和隐藏了密码算法的具体实现,这样用户就不需要去关心它。典型的CSP有Microsoft Base Cryptographic Provider、Microsoft RSA Base Provider等。
每个CSP都有一个名字和一个类型。为了便于CryptoAPI找到对应的CSP,每个CSP的名字都是惟一的。微软预定义的CSP类型目前有PROV_RSA_AES 、PROV_RSA_SIG 、PROV_DSS 等10种,分别支持不同的密钥交换算法、签名算法、对称加密算法和Hash算法。
每个CSP都有一个密钥库(Key Database),里面存储着算法密钥。每个密钥库都包含一个或多个密钥容器(Key Container),每个密钥容器中保存有属于一个特定用户的所有密钥对。每个用户通常有两对公私钥对,一对用来加密会话密钥,一对用来创建数字签名。每个密钥容器都被赋予一个惟一的名字,这个名字是程序要获得此容器句柄时传递给函数CryptAcquireContext的参数。
用CryptoAPI实现基于USBKEY的数字签名
按照使用CryptoAPI进行数字签名的一般流程,对数据进行签名,首先要创建一个密钥容器(或指定使用一个现有的CSP密钥容器),以便存储密钥和进行以后的工作。然后从密钥容器当中取得密钥对,导出公钥发给接收者用来验证签名,私钥用于签名。接着便可以创建一个Hash对象,先散列要签名的数据,最后便可以对此Hash数据进行签名了。其签名过程图解如图2所示。
对数据签名进行验证,首先也需要创建一个密钥容器(或指定一个现有的CSP密钥容器),以便存储密钥和进行以后的工作。然后从发送者那得到的公钥,导出公钥句柄用来验证签名。接着便可以创建一个Hash对象,先散列原始消息的数据,最后由散列值,公钥句柄和签名便可验证此签名了。
1.USB KEY简介
USB KEY是一种USB接口的硬件设备,它内置单片机或智能卡芯片,有一定的存储空间,主要用于保存数字证书和用户私钥。通过USB KEY生产厂商开发的驱动程序,还可以完成数据加解密、签名验证等功能。
但因为各个厂商开发的驱动接口程序没有统一的标准,用户针对某一型号USB KEY接口函数开发的加解密/签名应用程序,在更换不同厂家型号的USB KEY之后一般无法正常使用,还需要重新再次开发,作者在实际工作中就遇到了这种情况。经过调研后发现,各USB KEY生产厂商一般都会提供符合微软CryptoAPI标准的CSP中间件,用于硬件USB KEY的应用开发。换言之,如果使用CryptoAPI标准函数,就可以开发出通用的、兼容各USB KEY生产厂商CSP中间件的加解密/签名应用程序。
2.实现过程
第一步要获得硬件USB KEY对应的CSP名称。为了获取与USB KEY对应的CSP密钥容器操作句柄,必须首先知道该CSP的惟一名称。获取的途径有两种:一是在安装硬件USB KEY生产厂商提供的驱动程序时,安装程序会将该USB KEY对应的CSP名称、类型、对应的动态链接库(DLL)等信息写入系统注册表中。第二种方法就是使用函数 CryptEnumProviders,通过枚举的方式获得。第二步就是代码实现,限于篇幅,在此不再赘述。
微软CryptoAPI是PKI推荐使用的加密API,它隐藏了具体密码算法的实现细节,程序员利用该接口可以开发出安全的应用程序或产品,而无需太多密码学方面的背景知识。但使用CryptoAPI编程时需要了解CryptoAPI的系统结构以及CryptoAPI与CSP的关系。在实现某个函数功能时,还需调用很多其他的相关函数,且每个函数的参数较多,使用起来比较复杂。
作者在工作中,用CryptoAPI实现了某系统中基于硬件USB KEY的通用数字签名。即用同一段代码,实现了兼容不同种类硬件USB KEY的通用数字签名程序,希望能给大家以帮助。