数字签名算法(RSA)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:数字签名算法(RSA)
一、课题名称
实现数字签名,其中加密算法使用RSA。
二、课题内容和要求
1、主要任务与目标
1)被发送文件采用某种算法对原始消息进行运算,得到一个固定长度的数字串,称为消息摘要(MD),不同的消息得到的消息摘要各异,但是对相同的消息它的消息摘要却是唯一的;
2)发送方生成消息的消息摘要,用自己的私钥对摘要进行加密来形成发送方的数字签名;
3)这个数字签名将作为消息的附件和消息一同用接收方的公钥进行加密,将加密后的密文一起发送给接收方;
4)接收方首先把接收到的密文用自己的私钥解密,得到原始消息和数字签名,再用发送方的公钥解密数字签名,随后用同样的算法计算出消息摘要;
5)如果计算出来的消息摘要和发送方发送给他的消息摘要(通过解密数字签名得到的)是相同的,这样接收方就能确认数字签名确实是发送方的,否则就认为收到的消息是伪造的或是中途被篡改的。
数字签名通过认证技术来辨认真伪。认证技术主要包括数字签名认证、身份认证以及公开密钥证明等。数字签名认证机制提供了一种对数字签名进行鉴别的方法;身份认证机制提供了辨别和确认通信双方真实身份的方法;公开密钥证明机制则对密钥进行验证。网络时代中,人们验证数字签名来确定你正在和谁打交道,验证你的文件是否已被黑客篡改。数据的安全性和真实性已成为网络安全中至关重要的一部分。
数字签名类似手书签名,它具有以下的性质:
1)能够验证签名产生者的身份,以及产生签名的日期和时间;
2)能用于证实被签消息内容;
3)数字签名可由第三方验证,从而能够解决通信双方的争议。
为了实现数字签名的以上性质,它就应满足下列要求:
1)签名是可信的:任何人都可以验证签名的有效性;
2)签名是不可伪造的:除了合法的签名者外,任何人伪造其签名是困难的;
3)签名是不可复制的:对一个消息的签名不能通过复制变为另一个消息的签名。如
果一个消息的签名是从别处复制得到的,则任何人都可以发现消息与签名之间的不一致性,从而可以拒绝签名的消息;
4)签名的消息是不可改变的:经签名的消息不能篡改,一旦签名的消息被篡改,任何人都可以发现消息与签名之间的不一致性;
5)签名是不可抵赖的:签名者事后不能否认自己的签名。可以由第三方或仲裁方来确认双方的信息,以做出仲裁。
2、各模块功能描述
模块一创建创建密钥容器,得到CSP句柄
微软的CryptoAPI是PKI推荐使用的加密API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP之间(见图一)。
图一
从图一可以看到,每个CSP有一个密钥库,密钥库用于存储密钥。而每个密钥库包括一个或多个密钥容器(Key Containers)。每个密钥容器中含属于一个特定用户的所有密钥对。每个密钥容器被赋予一个唯一的名字。在销毁密钥容器前CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公/私钥对。
在这个模块中,实现创建密钥容器,得到CSP密钥句柄的作用,并且它被绑定到以UserName为名的密钥容器上。
模块二计算Hash值,签名
在这个模块中,实现实现对原始报文的签名。首先,对原始报文进行散列值的计算。此处通过CryptoAPI中的函数,直接调用实现。然后调用CryptSignHash(),对散列值进行签名。过程如图二所示。
计算Hash
对Hash进行签名
图二
模块三验证签名
负责验证签名的人在收到签名者发来的公钥、数据及签名后,先用CryptImportKey()将签名者的公钥导入密钥容器中,验证者通过对原文的Hash计算,并与收到的Hash值对比,验证是否是发送方发送的消息,并可验证其正确性。过程如图三所示。
导入公钥
计算Hash
验证签名
图三
三、概要设计
1、函数CryptAcquireContext(),获得指定CSP容器的句柄。主要参数表如下:
PhProv()CSP句柄指针
PszContainer()密钥容器名称,指向密钥容器的字符串指针
Pszprovider()指向CSP名称的字符串指针
这个函数用来实现取得指定CSP句柄密钥容器,以后任何的加密都是针对这个CSP 句柄而言。
2、函数CryptGenKey(),用来随即产生密钥。主要参数如下:
hCryptProv, CSP句柄
AT_SIGNATURE, 创建的密钥对类型为signature key pair
0, key类型,这里用默认值
&hKey 创建成功返回新创建的密钥对的句柄
3、函数CryptCreateHash(),用来创建Hash对象。参数如下:HCRYPTPROV hProv, CSP句柄
ALG_ID Algid, 选择hash算法,比如CALG_MD5等
HCRYPTKEY hKey, HMAC 和MAC算法时有用
DWORD dwFlags, 保留,传入0即可
HCRYPTHASH* phHash 返回hash句柄
4、函数CryptHashData(),用来Hash数据。参数如下:
HCRYPTHASH hHash, hash对象
BYTE* pbData, 被hash的数据
DWORD dwDataLen, 数据的长度
DWORD dwFlags 微软的CSP这个值会被忽略
5函数CryptDeriveKey(),用于调用CryptDeriveKey获取对话密码,参数如下:
hCryptProv, CSP句柄
CALG_RC2, 一个ALG_ID结构,用来指定对称密钥生成的算法
hHash, 哈希对象
CRYPT_EXPORTABLE, 指定生成密钥的类型,CRYPT_EXPORTABLE意味着这个
程序生成的密钥可以被其它程序调用,而不是仅仅限于这个程序当中。但是它不能用于非对称密码中。
&hKey 指向生成的密钥
5、总体设计
发送方验证方