数字签名课程设计

上传人:ji****72 文档编号:27375771 上传时间:2018-01-09 格式:DOC 页数:18 大小:212.50KB
返回 下载 相关 举报
数字签名课程设计_第1页
第1页 / 共18页
数字签名课程设计_第2页
第2页 / 共18页
数字签名课程设计_第3页
第3页 / 共18页
数字签名课程设计_第4页
第4页 / 共18页
数字签名课程设计_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《数字签名课程设计》由会员分享,可在线阅读,更多相关《数字签名课程设计(18页珍藏版)》请在金锄头文库上搜索。

1、1.RSA 数字签名的目的和意义RSA 公开密钥加密算法自 20 世纪 70 年代提出以来,已经得到了广泛认可和应用。发展至今,电子安全领域的各方面已经形成了较为完备的国际规范。RSA 作为最重要的公开密钥算法,在各领域的应用数不胜数。RSA 在硬件方面,以技术成熟的 IC 应用于各种消费类电子产品。RSA 在软件方面的应用,主要集中在 Internet 上。加密连接、数字签名和数字证书的核心算法广泛使用 RSA。日常应用中,有比较著名的工具包 Open SSL(SSL,Security Socket Layer,是一个安全传输协议,在 Internet 上进行数据保护和身份确认。Open S

2、SL 是一个开放源代码的实现了 SSL 及相关加密技术的软件包,由加拿大的Eric Yang 等发起编写的。 Open SSL 应用 RSA 实现签名和密钥交换,已经在各种操作系统得到非常广泛的应用。另外,家喻户晓的 IE 浏览器,自然也实现了 SSL 协议,集成了使用 RSA 技术的加密功能,结合 MD5 和 SHA1,主要用于数字证书和数字签名,对于习惯于使用网上购物和网上银行的用户来说,几乎天天都在使用 RSA 技术。RSA 更出现在要求高度安全稳定的企业级商务应用中。在当今的企业级商务应用中,不得不提及使用最广泛的平台 j2ee。事实上,在 j2se 的标准库中,就为安全和加密服务提供

3、了两组 API:JCA 和JCE。 JCA (Java Cryptography Architecture)提供基本的加密框架,如证书、数字签名、报文摘要和密钥对产生器; JCA 由几个实现了基本的加密技术功能的类和接口组成,其中最主要的是 java.security包,此软件包包含的是一组核心的类和接口,Java 中数字签名的方法就集中在此软件包中。JCE(Java Cryptography Extension) 在 JCA的基础上作了扩展,JCE 也是由几个软件包组成,其中最主要的是javax.crypto 包,此软件包提供了 JCE 加密技术操作API。 javax.crypto 中的

4、Cipher 类用于具体的加密和解密。在上述软件包的实现中,集成了应用 RSA 算法的各种数据加密规范(RSA 算法应用规范介绍参见: http:/ ,这些 API 内部支持的算法不仅仅只有 RSA,但是 RSA 是数字签名和证书中最常用的),用户程序可以直接使用 java 标准库中提供的 API 进行数字签名和证书的各种操作。2数字签名算法的基本框架1密钥的产生选择两个保密的大素数 P 和 q。计算 N=p q,(N) =(p-1)(g-1) ,其中(N) 是 N 的欧拉函数值。选择一个整数 e,满足 le(N) ,且 g c d(N),e) 1。计算私钥 d(解密密钥),满足 e dl(m

5、od(N),d 是 e 在模(N) 下的乘法逆元。 以(e, n)为公钥, (d ,N)为密钥,销毁 p,q,(N) 。2加密加密时首先将明文比特串进行分组,使得每个分组对应得串在数值上小于 N, 即分组的二进制长度小于 l092N。然后,对每个明文分组 M,作加密运算: C=E k(M)=M e mod N 3解密对密文分组的解密运算为:M=D k (C) =C d mod N 由定理 1 和定理 2 可以证明解密运算能恢复明文 M 并非所有的公开密钥系统,均可同时达到秘密性与数字签名功能。一般而言, 一公开密钥系统若作为密码系统,则无法作为数字签名,反之亦然。只有很少数的系统可同时作为密码

6、系统和数字签名,如本文讨论的 RSA 系统。RSA 签名算法如下: 设 N=p q,且 p 和 q 是两个大素数,e 和 d 满足 e dl(mod (N)。公开密钥:N,e 私有密钥:d 签名过程:发送方使用自己的私钥 d 对明文 m 进行数字签名变换: y=x d mod N:并将加密后的消息和签名 y 发送给接收方; 验证过程:接收方使用发送方的公钥 e 对收到的消息 y 进行数字签名验证变换 x=ye mod N,并使用发送方的密钥解密恢复消息x,比较 x与 x,如果 x=x 则证实发送方的身份合法。这样,用户 A 若想用 RSA 签名方案对消息 x 签名,他只需公开他的公钥 N 和

7、e,由于签名算法是保密的,因此 A 是唯一能产生签名的人,任何要验证用户 A 签名的用户只需查到 A 的公钥即可验证签名。对于实现签名和公钥加密的组合,常用方法是:假定通信双方为 A 和 B。对于明文 x,A 计算他的签名 y=x d mod N,然后利用 B的公开加密函数 EB 对信息对(x, y)加密得到 Z,将密文 Z 传送给 B,当 B 收到密文 Z 后,他首先用他的解密函数 DB 来解密得到(x ,y)=DB (Z)= DB (EB(x,y) ,然后利用 A 的验证算法来检查 x=x=y e mod N 是否成立。3.主要模块的算法以及关键代码文件选择模块的主要算法及关键代码Cfil

8、eDialog dlg(TRUE,NULL,.签名的文件,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()=IDOK)m_file_sign=dlg.GetPathName();else m_file_sign=;UpdateData(FALSE);保存公钥的文件路径的主要算法及关键代码CFileDialog dlg(FALSE,NULL,.公钥,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()=IDOK)m_pkey_sign=dlg

9、.GetPathName();else m_pkey_sign=;UpdateData(FALSE);保存签名后的文件的路径主要算法及关键代码CFileDialog dlg(FALSE,NULL,.签名后的文件,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()=IDOK)m_signed_sign=dlg.GetPathName();else m_signed_sign=;UpdateData(FALSE);数字签名的主要算法及关键代码HCRYPTPROV hProv;/秘钥容器句柄 BYTE *pbBuffer;

10、/被签名的数据HCRYPTHASH hHash;HCRYPTKEY hKey;BYTE *pbKeyBlob; /签名者得公钥数据BYTE *pbSignature; /数字签名DWORD dwSigLen;DWORD dwBlobLen;DWORD dwBufferLen;LPTSTR szDescription = ; CFile m_pubkey_file,m_sign_file,m_signdatafile;if(m_pkey_sign=|!m_pubkey_file.Open(m_pkey_sign,CFile:modeCreate|CFile:modeReadWrite)Messa

11、geBox(请选择正确的保存公钥的文件路径);return;if(m_file_sign=|!m_signdatafile.Open(m_file_sign,CFile:modeReadWrite)MessageBox(请选择正确的文件路径);return;if(m_signed_sign=|!m_sign_file.Open(m_signed_sign,CFile:modeCreate|CFile:modeReadWrite)MessageBox(请选择正确保存数字签名的文件路径);return;UpdateData(TRUE);m_state_sign=;/获取缺省的秘钥容器if(Cryp

12、tAcquireContext(&hProv, NULL, NULL, m_prov_sign,0)m_state_sign+=已获取 CSP 上下文,秘钥生成算法:+GetProvType(m_prov_sign)+n;else/密钥容器不存在创建之if(CryptAcquireContext(&hProv, NULL, NULL, m_prov_sign, CRYPT_NEWKEYSET) m_state_sign+=已创建一个新的密钥容器,秘钥生成算法:+GetProvType(m_prov_sign)+n;else m_state_sign+=MyHandleError(在获取 CSP

13、 时发生错误,程序停止.);UpdateData(FALSE);return;/ 从密钥容器中取数字签名用的密钥if(CryptGetUserKey( hProv, AT_SIGNATURE, &hKey) m_state_sign+=签名密钥已经获取. n;elseif(GetLastError() = NTE_NO_KEY) /密钥容器里不存在signature key pair 创建之if(CryptGenKey(hProv, /CSP 句柄AT_SIGNATURE, /创建的密钥对类型为signature key pair0, /key 类型,这里用默认值&hKey) /创建成功返回新

14、创建的密钥对的句柄m_state_sign+=创建一个秘钥对n;else m_state_sign+=MyHandleError(在创建签名密钥对时发生错误,程序停止.n); UpdateData(FALSE);return;elsem_state_sign+=MyHandleError(在获取签名密钥时发生错误,程序停止.);UpdateData(FALSE);return;/ 因为接收消息者要验证数字签名,所以要导出公钥给接收者。if(CryptExportKey( hKey, NULL, PUBLICKEYBLOB,0, NULL, &dwBlobLen) /得到公钥的大小m_state

15、_sign+=已获取公钥的大小,;else m_state_sign+=MyHandleError(计算公钥大小时发生错误,程序停止.);UpdateData(FALSE);return;/ 为存储公钥的缓冲区分配内存。if(pbKeyBlob = (BYTE*)malloc(dwBlobLen) m_state_sign+=已为公钥分配内存n;else m_state_sign+=MyHandleError(为公钥分配内存时出现异常,退出. n);UpdateData(FALSE);return;/ 真正导出公钥数据if(CryptExportKey( hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, /公钥 这个数据可以存入文件,发送给接收者。一般被存入数字证书&dwBlobLen)m_pubkey_file.Write(pbKeyBlob,dwBlobLen);m_state_sign+=已导出公钥,存储在+m_pubkey_file.GetFilePath()+n;elsem_state_sign+=MyHandleError(导出公钥时发生错误,退

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号