DSA数字签名算法1引言为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。DSA(DigitalSignatureAlgorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去确定签名和所签数据的真实性。DSA算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。2.数字签名2.1数字签名的概念数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。数字签名是通过一个单向函数对要传送的信息进行处理得到的用以认证信息来源并核实信息在传送过程中是否发生变化的一个字母数字串。数字签名提供了对信息来源的确定并能检测信息是否被篡改。数字签名要实现的功能是我们平常的手写签名要实现功能的扩展。平常在书面文件上签名的主要作用有两点,一是因为对自己的签名本人难以否认,从而确定了文件已被自己签署这一事实;二是因为自己的签名不易被别人模仿,从而确定了文件是真的这一事实。采用数字签名,也能完成这些功能:(1)确认信息是由签名者发送的;(2)确认信息自签名后到收到为止,未被修改过;签名者无法否认信息是由自己发送的。数字签名和手签的区别是:手签是模拟的,易伪造,而数字签名是基于数学原理的,更难伪造。数字签名的技术基础是公钥密码技术。密钥必须以某种安全的方式告诉解密方。大家熟悉的DES加密标准就是一种对称加密技术。1976年,Diffie和Hellman在一篇名叫“NewDirectioninCryptography(密码学的新方向)”一文中提出了一个新的思想,即:不仅加密算法本身可以公开,就是加密用的密钥本身也可以公开。这就是公钥密码体制。其中使用的密钥被分解为一对:一把公钥和一把私钥。只要私钥保密就可以了,公钥可以发到因特网(如网站的黄页)等公开地方供别人查询和下载。2.2数字签名的原理图1.数字签名的原理图处理过程:(采用双重加密)(1)使用SHA编码将发送文件加密产生128bit的数字摘要;(2)发送方用自己的专用密钥对摘要再加密,形成数字签名;(3)将原文和加密的摘要同时传给对方;(4)接受方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生同一摘要;(5)将解密后的摘要和收到的文件在接受方重新加密产生的摘要相互对比,如果两者一致,则说明在传送过程中信息没有破坏和篡改。否则,则说明信息已经失去安全性和保密性。3数字签名的方案3.1RSA数字签名系统RSA算法中数字签名技术实际上是通过一个哈希函数来实现的。数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。用RSA或其它公开密钥密码算法的最大方便是没有密钥分配问题。因为公开密钥加密使用两个不同的密钥,其中有一个是公开的,另一个是保密的。公开密钥可以保存在系统目录内、未加密的电子邮件信息中、电话黄页(商业电话)上或公告牌里,网上的任何用户都可获得公开密钥。3.2Hash签名Hash签名是最主要的数字签名方法,也称之为数字摘要法(DigitalDigest)或数字指纹法(DigitalFingerPrint)。它与RSA数字签名是单独的签名不同,该数字签名方法是将数字签名与要发送的信息紧密联系在一起,它更适合于电子商务活动。将一个商务合同的个体内容与签名结合在一起,比合同和签名分开传递,更增加了可信度和安全性。一个Hash函数满足:①H可以作用于一个任意长度的数据块;②H产生一个固定长度的输出;③H(x)对任意给定的x计算相对容易,无论是软件还是硬件实现;④对任意给定码h,找到x满足H(x)=h具有计算不可行性;⑤对任意给定的数据块x,找到满足H(y)=H(x)的yx具有计算不可行性;⑥找到任意数据对(x,y),满足H(x)=H(y)是计算不可行的。用Hash函数实验签名的方案如下:发送方X:准备消息M,计算其散列码H(M),用X的私钥对散列值构成签名Kx-1[H(M)],并将消息M及签名Kx-1[H(M)]发送给Y接收方Y:对收到的消息M′计算用H(M′),利用公钥解密Kx-1[H(M)],然后比较Kx[Kx-1[H(M)]]和H(M′),如果Kx[Kx-1[H(M)]]=H(M′),则签名得到验证。3.3椭圆曲线数字签名算法(ECDSA)椭圆曲线的数字签名具有与RSA数字签名和DSA数字签名基本上相同的功能,但实施起来更有效,因为椭圆曲线数字签名在生成签名和进行验证时要必RSA和DSA来得快。椭圆曲线数字签名的速度要比RSA、DSA快,还可以用在一些较小、对资源有一定限制得设备如智能卡(含有微处理器芯片得塑料片)中。3.4美国数字签名标准(DSA)数字签名算法(DigitalSignatureAlgorithm,DSA)是Schnorr和ElGamal签名算法的变种,由美国国家标准化技术研究院(NIST)和国家安全局共同开发。DSA是基于离散对数的难度。4基于DSA数字签名的实现方法建立在公钥密码技术上的数字签名方法有很多,有RSA签名、DSA签名和椭圆曲线数字签名算法(ECDSA)等等。下面对DSA签名进行详细分析。(1)DSA算法参数说明DSA算法中应用了下述参数:p:Lbits长的素数。L是64的倍数,范围是512到1024;q:p-1的160bits的素因子;g:g=hp-1modp,h满足hp-1,h(p-1)/qmodp1;x:1xq,x为私钥;y:y=gxmodp,(p,q,g,y)为公钥;H(x):单向Hash函数。在DSS中选用安全散列算法(SecureHashAlgorithm,SHA)[]。p,q,g:可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。(2)签名及验证协议签名及验证协议如下:①P产生随机数k,kq;②P计算r=(gkmodp)modq和s=(k-1(H(m)+xr))modq签名结果是(m,r,s)。③验证时计算w=s-1modq计算u1=(H(m)*w)modq计算u2=(r*w)modq计算v=((gu1*yu2)modp)modq若v=r,则认为签名有效。5.结果在VC++编译环境下,可实现对DSA数字签名。其中对摘要的加密和签名可以选择不同的算法。结果如图:6.结论DSA主要依赖于整数有限域离散对数难题。素数P必须足够大,且p-1至少包含一个大素数因子以抵抗Pohlig&Hellman算法的攻击。M一般都应采用信息的HASH值(官方推荐为SHA算法)。DSA的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。DSA的安全性要次于ECC与RSA不相上下。但是有一点,就是DSA算法的验证过程R,S是以明文形式出现的,这点很容易被利用。但是随着加密技术的发展,椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线对数字签名算法(DSA)的模拟。与普通的离散对数问题(discretelogarithmproblemDLP)和大数分解问题(integerfactorizationproblemIFP)不同,椭圆曲线离散对数问题(ellipticcurvediscretelogarithmproblemECDLP)没有亚指数时间的解决方法。因此椭圆曲线密码的单位比特强度要高于其他公钥体制。7.附录//数字签名Dlg.cpp:implementationfile//#includestdafx.h#include数字签名.h#include数字签名Dlg.h#includeBigInt.h#includeMD5.h#includeSHA1.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endifCBigIntsha(CBigInty);CBigIntpow2(constintx,inty);CBigIntmakerandnumber(unsignedintlen);CBigIntpow3(CBigIntx,CBigInty,CBigIntm);///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg();//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://{{AFX_MSG(CAboutDlg)virtualvoidOnOK();//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////DMyDlgdialogDMyDlg::DMyDlg(CWnd*pParent/*=NULL*/):CDialog(DMyDlg::IDD,pParent){//{{AFX_DATA_INIT(DMyDlg)m_P=_T();m_Q=_T();m_G=_T();//mpdifiedin2007.6.10m_Y=_T();m_S=_T();m_V=_T();m_Len=0;m_OUT=_T();m_IN=_T();ready=0;m_file=_T();m_string=_T();//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);}voidDMyDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(DMyDlg)DDX_Text(pDX,IDC_P,m_P);DDX_Text(pDX,IDC_Q,m