ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:188.34KB ,
资源ID:22688731      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22688731.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字签名算法RSAWord格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数字签名算法RSAWord格式.docx

1、如果一个消息的签名是从别处复制得到的,则任何人都可以发现消息与签名之间的不一致性,从而可以拒绝签名的消息;4)签名的消息是不可改变的:经签名的消息不能篡改,一旦签名的消息被篡改,任何人都可以发现消息与签名之间的不一致性;5)签名是不可抵赖的:签名者事后不能否认自己的签名。可以由第三方或仲裁方来确认双方的信息,以做出仲裁。2、各模块功能描述模块一 创建创建密钥容器,得到CSP句柄 微软的CryptoAPI是PKI推荐使用的加密 API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP之间(见图一)。 图一从图一可以看到

2、,每个CSP有一个密钥库,密钥库用于存储密钥。而每个密钥库包括一个或多个密钥容器(Key Containers)。每个密钥容器中含属于一个特定用户的所有密钥对。每个密钥容器被赋予一个唯一的名字。在销毁密钥容器前CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公/私钥对。在这个模块中,实现创建密钥容器,得到CSP密钥句柄的作用,并且它被绑定到以UserName为名的密钥容器上。模块二 计算Hash值,签名 在这个模块中,实现实现对原始报文的签名。首先,对原始报文进行散列值的计算。此处通过CryptoAPI中的函数,直接调用实现。然后调用CryptSignHash(),对散列值进行签名。过

3、程如图二所示。 图二模块三 验证签名 负责验证签名的人在收到签名者发来的公钥、数据及签名后,先用CryptImportKey()将签名者的公钥导入密钥容器中,验证者通过对原文的Hash计算,并与收到的Hash值对比,验证是否是发送方发送的消息,并可验证其正确性。 过程如图三所示。 图三三、概要设计1、函数CryptAcquireContext(),获得指定CSP容器的句柄。主要参数表如下:PhProv() CSP句柄指针PszContainer() 密钥容器名称,指向密钥容器的字符串指针Pszprovider() 指向CSP名称的字符串指针这个函数用来实现取得指定CSP句柄密钥容器,以后任何的

4、加密都是针对这个CSP句柄而言。2、函数CryptGenKey(),用来随即产生密钥。主要参数如下:hCryptProv, CSP句柄AT_SIGNATURE, 创建的密钥对类型为signature key pair0, key类型,这里用默认值&hKey 创建成功返回新创建的密钥对的句柄3、函数CryptCreateHash(),用来创建Hash对象。参数如下:HCRYPTPROV hProv, CSP句柄ALG_ID Algid, 选择hash算法,比如CALG_MD5等HCRYPTKEY hKey, HMAC 和MAC算法时有用DWORD dwFlags, 保留,传入0即可HCRYPTH

5、ASH* 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意味

6、着这个 程序生成的密钥可以被其它程序调用,而不是仅仅限于这个程序当中。但是它不能用于非 对称密码中。hKey 指向生成的密钥5、总体设计 发送方 验证方四、详细设计1、RSA算法描述RSA算法是一种公钥密码算法,实现RSA算法包括生成RSA密钥,加密和解密数据。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性

7、能如何,而且密码学界多数人士倾向于因子分解不是NP-C问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits。RSA算法的实现原理:1) 随机选择两个不同的素数p和q,它们的宽度是密钥宽度的二分之一。2) 计算出p和q的乘积n 。3) 在2和(n)之间随机选择一个数e , e 必须和(n)互素,整数e用做加密密钥(其中(n)=(p-1)*(q-1)。4) 从公式ed 1 mod (n)中求出解密密钥d 。5) 得公钥(e ,n ), 私钥 (d , n) 。6) 公开公钥,但不公开私钥。7) 将

8、明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n;8) 将密文C解密为明文P,计算方法为: P=Cd mod n;然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。2、创建密钥容器,得到CSP句柄此处调用函数CryptAcquireContext(),创建密钥容器,当Flag values值为零,说明以UserName为名的密钥容器存在,那么我们已经得到了CSP的句柄具体实现代码如下:if(CryptAcquireContext(hCryptProv, / 返回CSP句柄UserN

9、ame, / 密码容器名NULL, / NULL时使用默认CSP名(微软RSA Base Provider)PROV_RSA_FULL, / CSP类型0) / Flag values printf(得到了CSP句柄, UserName); 如果密钥容器不存在,我们需要重新创建这个密钥容器: &hCryptProv, UserName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET) /创建以UserName为名的密钥容器 /创建密钥容器成功,并得到CSP句柄一个新的密钥容器被创建n); else HandleError(创建失败.n 此时就已经创建了密钥容器,并得

10、到了CSP的句柄。也可以这样理解,我们得到了一个CSP的句柄,并且它被绑定到以UserName为名的密钥容器上。可以如下删除密钥容器。CryptAcquireContext(&hCryptProv,userName,NULL,PROV_RSA_FULL, CRYPT_DELETEKEYSET);3、RSA算法描述具体程序实现如下:1、读取原文void CGenRsaKey:OnSOpenButton() / TODO: Add your control notification handler code here UpdateData(TRUE); char szFilter = 全部文件(*

11、.*)|*.*|; CFileDialog OpenFile(TRUE, NULL, *.*, OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_NOCHANGEDIR, szFilter, NULL); if(OpenFile.DoModal() != IDOK) return; m_strSSrcPath = OpenFile.GetPathName(); UpdateData(FALSE); return;/产生随机密钥OnVerifySaveButton() static char szFilter = CFileDialog saveFileDlg(FAL

12、SE, NULL, , OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_NOCHANGEDIR,szFilter,NULL); if(saveFileDlg.DoModal() ! m_strVDestPath = saveFileDlg.GetPathName();OnRsaSign() if(m_strSSrcPath = m_strVDestPath = ) MessageBox(请选择待签名/待验证文件路径!/读取签名原文失败 CFile fpSrcFile; if(fpSrcFile.Open(m_strVDestPath, CFile:modeRead

13、) = 0)读取签名原文失败! nSrcLen = fpSrcFile.GetLength(); pbSrcData = new unsigned char nSrcLen+1; memset(pbSrcData, 0x00, nSrcLen+1); fpSrcFile.Read(pbSrcData, nSrcLen); fpSrcFile.Close();2、获得CSP句柄int CKeyOperation:CRYPTAPI_RSAVerify(unsigned char *pbSrcData, int nSrcLen, unsigned char *pbDestData, int nDes

14、tLen) if(!m_hProv, ASYSIGN, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) return -1;CryptGetUserKey(m_hProv, AT_SIGNATURE, &m_hKey) if(m_hProv) CryptReleaseContext(m_hProv, 0); return -2; 3、创建Hash对象并Hash数据HCRYPTHASH hHash;CryptCreateHash(m_hProv, CALG_SHA, 0, 0, &hHash) /创建HASH对象 /释放CSP句柄 return -3;CryptHashD

15、ata(hHash, pbSrcData, (unsigned long)nSrcLen, 0)/hash数据 if(hHash) CryptDestroyHash(hHash); /释放Hash句柄4、签名数据 /获得签名数据长度CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, (unsigned long *)pnDestLen) return -4; /签名HASH数据CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbDestData, (unsigned long *)pnDestLen) re

16、turn -5; if(hHash) CryptDestroyHash(hHash); if(m_hProv) return 0;5、读取签名数据 CFile fpDestFile; if(fpDestFile.Open(m_strSSrcPath, CFile: nDestLen = fpDestFile.GetLength(); fpDestFile.Read(pbDestData, nDestLen); fpDestFile.Close();CFile fpDestFile;6、Hash待验证数据/创建HASH对象hHash) /HASH待验证数据CryptHashData(hHash,

17、 pbSrcData, nSrcLen, 0)7、验证签名数据/验证签名数据CKeyOperation obj_Verify; int r = obj_Verify.CRYPTAPI_RSAVerify(pbSrcData, nSrcLen, pbDestData, nDestLen); if(r != 0)验证签名失败! delete pbSrcData; pbSrcData = NULL; MessageBox(验证签名成功!if(!CryptVerifySignature(hHash, pbDestData, nDestLen, m_hKey, NULL, 0) if(hHash) Cr

18、yptReleaseContext(m_hProv, 0);五、测试数据及其结果分析测试时,在签名原文中输入数据:1234567890生成RSA密钥对,并导出公钥程序显示产生RSA密钥对成功,说明在签名时产生密钥对运行没有问题。对签名原文进行签名,程序运行如下:程序运行显示签名数据成功,签名后数据长度为128字节,签名后的数据存放在.txt文档中,便于在下一步进行验证比较。签名后的数据显示如下:记事本显示为乱码,因为输出为16进制,在记事本中的显示就为乱码,当放入控制台时,显示就为16进制数。发现数据长度为128字节,签名正确。对签名进行验证,程序运行如下:待验证文件选择为签名后的数据,签名原

19、文选择原文件。按下验证签名按钮,产生对话框,说明验证签名成功,程序运行无误。六、软件设计总结本次的课程设计,主要是熟悉了数字签名的具体过程,并了解了RSA算法的具体实现步骤,更重要的是学会了CryptoAPI的使用,通过调用其中的函数,很方便的实现了加密以及签名的功能。再次总结一下收获。1、关于CSPCSP是真正执行加密工作的独立的模块。物理上一个CSP由两部分组成:一个动态链接库,一个签名文件。若加密算法用硬件实现,则CSP还包括硬件装置。其决定了以下因素:(1)有且仅有一个密钥交换算法;(2)有且仅有一个签名算法;(3)特定的KeyBlob格式;(4)特定的数字签名格式;(5)特定的密钥推

20、导模式;(6)特定的密钥长度;(7)特定的分组加密算法的缺省模式。2、几个误区 通过本次数字签名的实验,我通过上网查阅资料等方式,发现存在着这样几个误区。误区一:大家对公钥私钥区分得太死板了。其实当你把公钥保密不公开的时候,公钥就是私钥了;当你把私钥公开的时候,私钥也是公钥了。没必要记得这么死的。密钥与私钥只是相对的概念,RSA中产生的e与d,当把e公布出去时,e就是公钥,d就是私钥。相反的e就变成了私钥。误区二:对RSA算法的原理理解不够,实际上所谓的公钥和私钥只是RSA算法(说穿了RSA就是个数学方程式)的参数(未知数),比如 X+Y+M=Z,X就可以说是私钥,Y就可以说是公钥,M就是需要

21、加密的内容,Z就是加密后的密文,当然RSA中不可能只有X和Y两个未知数的,所以就经常有朋友问,到底X是私钥还是Y是钥。其实这个就要取决于你用在时候,什么地方了。误区三:对Security.Cryptography命名空间不熟悉。“数字签名”一般的做法是:A先计算出文件M的HASH码,再对HASH码进行加密(这个步骤就是签名),再把M(文件M不要加密,第三方可以查阅)和加密后的HASH码传送给B,B再用A的公钥来解密刚才得到的加密HASH码,如果能解密,那就说明这个文件是A发的,具有法律效应。再计算出得到的文件M的HASH码,再和刚才解密出来的HASH码比较(这个步骤叫验证签名),如果一致就说明文件M在传输过程中没有被修改。但是需要解密RSA,就必须提供公钥和私钥,当然这和我们的现实不符,因为A不可能把他的私钥给B。许多人就是在这里难住了。其实Security.Cryptography命名空间中有RSA

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1