DSA数字签名算法.doc

上传人:文库蛋蛋多 文档编号:3931695 上传时间:2023-03-28 格式:DOC 页数:13 大小:1.06MB
返回 下载 相关 举报
DSA数字签名算法.doc_第1页
第1页 / 共13页
DSA数字签名算法.doc_第2页
第2页 / 共13页
DSA数字签名算法.doc_第3页
第3页 / 共13页
DSA数字签名算法.doc_第4页
第4页 / 共13页
DSA数字签名算法.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《DSA数字签名算法.doc》由会员分享,可在线阅读,更多相关《DSA数字签名算法.doc(13页珍藏版)》请在三一办公上搜索。

1、 DSA数字签名算法1 引言为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。DSA(Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去确定签名和所签数据的真实性。DSA算法的安全性基于解离散对数的困难性,这

2、类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。2. 数字签名2.1 数字签名的概念数字签名在ISO74982标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。数字签名是通过一个单向函数对要传送的信息进行处理得到的用以认证信息来源并核实信息在传送过程中是否发生变化的一个字母数字串。数字签名提供了对信息来源的确定并能检测信息是否被篡改。数字签名要实现的功能是我们平常的手写签名要实现功能的扩展。平常在书面文件上签名的主要作用有两点,一是

3、因为对自己的签名本人难以否认,从而确定了文件已被自己签署这一事实;二是因为自己的签名不易被别人模仿,从而确定了文件是真的这一事实。采用数字签名,也能完成这些功能:(1)确认信息是由签名者发送的;(2)确认信息自签名后到收到为止,未被修改过;签名者无法否认信息是由自己发送的。数字签名和手签的区别是:手签是模拟的,易伪造,而数字签名是基于数学原理的,更难伪造。数字签名的技术基础是公钥密码技术。密钥必须以某种安全的方式告诉解密方。大家熟悉的DES加密标准就是一种对称加密技术。1976年,Diffie和Hellman在一篇名叫“New Direction in Cryptog raphy(密码学的新方

4、向)”一文中提出了一个新的思想,即:不仅加密算法本身可以公开,就是加密用的密钥本身也可以公开。这就是公钥密码体制。其中使用的密钥被分解为一对:一把公钥和一把私钥。只要私钥保密就可以了,公钥可以发到因特网(如网站的黄页)等公开地方供别人查询和下载。2.2 数字签名的原理 图1. 数字签名的原理图处理过程: (采用双重加密) (1)使用SHA编码将发送文件加密产生128bit的数字摘要; (2)发送方用自己的专用密钥对摘要再加密,形成数字签名; (3)将原文和加密的摘要同时传给对方; (4)接受方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生同一摘要; (5)将解密后的摘要和收

5、到的文件在接受方重新加密产生的摘要相互对比,如果两者一致,则说明在传送过程中信息没有破坏和篡改。否则,则说明信息已经失去安全性和保密性。3数字签名的方案3.1 RSA数字签名系统 RSA算法中数字签名技术实际上是通过一个哈希函数来实现的。数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。用RSA或其它公开密钥密码算法的最大方便是没有密钥分配问题。因为公开密钥加密使用两个不同的密钥,其中有一个是公开的,另一个是保密的。公开密钥可以保存在系统目录内、未加密的电子邮件信息中、电话黄页(商业电话)上或公告牌里,网上的任何用户都可获得公开密钥

6、。 3.2 Hash签名 Hash签名是最主要的数字签名方法,也称之为数字摘要法(Digital Digest)或数字指纹法(Digital Finger Print)。它与RSA数字签名是单独的签名不同,该数字签名方法是将数字签名与要发送的信息紧密联系在一起,它更适合于电子商务活动。将一个商务合同的个体内容与签名结合在一起,比合同和签名分开传递,更增加了可信度和安全性。一个Hash函数满足:H可以作用于一个任意长度的数据块;H产生一个固定长度的输出;H(x)对任意给定的x计算相对容易,无论是软件还是硬件实现;对任意给定码h,找到x满足H(x)=h具有计算不可行性;对任意给定的数据块x,找到满

7、足H(y)=H(x)的yx具有计算不可行性;找到任意数据对(x,y),满足H(x) = H(y)是计算不可行的。用Hash函数实验签名的方案如下:发送方X:准备消息M,计算其散列码H(M),用X的私钥对散列值构成签名Kx-1H(M),并将消息M及签名Kx-1 H(M)发送给Y接收方Y:对收到的消息M计算用H(M),利用公钥解密Kx-1H(M),然后比较Kx Kx-1 H(M)和H(M),如果Kx Kx-1 H(M) H(M),则签名得到验证。3.3 椭圆曲线数字签名算法(ECDSA)椭圆曲线的数字签名具有与RSA数字签名和DSA数字签名基本上相同的功能,但实施起来更有效,因为椭圆曲线数字签名在

8、生成签名和进行验证时要必RSA和DSA来得快。 椭圆曲线数字签名的速度要比RSA、DSA快,还可以用在一些较小、对资源有一定限制得设备如智能卡(含有微处理器芯片得塑料片)中。3.4 美国数字签名标准(DSA)数字签名算法(Digital Signature Algorithm,DSA)是Schnorr和ElGamal签名算法的变种,由美国国家标准化技术研究院(NIST)和国家安全局共同开发。DSA是基于离散对数的难度。4 基于DSA数字签名的实现方法 建立在公钥密码技术上的数字签名方法有很多,有RSA签名、DSA签名和椭圆曲线数字签名算法(ECDSA)等等。下面对DSA签名进行详细分析。(1)

9、DSA算法参数说明DSA算法中应用了下述参数:p:L bits长的素数。L是64的倍数,范围是512到1024;q:p - 1的160bits的素因子;g:g = hp-1 mod p,h满足h 1;x:1x q,x为私钥;y:y = gx mod p ,( p, q, g, y )为公钥;H( x ):单向Hash函数。在DSS中选用安全散列算法 ( Secure Hash Algorithm,SHA )。p, q, g:可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。(2)签名及验证协议签名及验证协议如下:P产生随机数k,k LoadIcon(IDR_MAINFRAME

10、);void DMyDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(DMyDlg)DDX_Text(pDX, IDC_P, m_P);DDX_Text(pDX, IDC_Q, m_Q);DDX_Text(pDX, IDC_G, m_G);/ mpdified in 2007.6.10DDX_Text(pDX, IDC_Y, m_Y);DDX_Text(pDX, IDC_S, m_S);DDX_Text(pDX, IDC_V, m_V);DDX_CBIndex(pDX, IDC_COM

11、BO, m_Len);DDX_Text(pDX, IDC_OUTPUT, m_OUT);DDX_Text(pDX, IDC_INPUT, m_IN);DDX_Text(pDX, IDC_EDITFILE, m_file);DDX_Text(pDX, IDC_STRING, m_string);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(DMyDlg, CDialog)/AFX_MSG_MAP(DMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_GET, OnBu

12、ttonGet)ON_BN_CLICKED(IDC_ENCRYPT, OnEncrypt)ON_BN_CLICKED(IDC_DECRYPT, OnDecrypt)ON_BN_CLICKED(IDC_Btnfile, OnBtnfile)ON_EN_CHANGE(IDC_EDITFILE, OnChangeEditfile)ON_EN_CHANGE(IDC_STRING, OnChangeString)ON_BN_CLICKED(IDC_SHA1_RADIO, OnSha1Radio)ON_BN_CLICKED(IDC_MD5_RADIO, OnMd5Radio)ON_CBN_EDITCHAN

13、GE(IDC_COMBO, OnEditchangeCombo)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ DMyDlg message handlersBOOL DMyDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABO

14、UTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set sm

15、all icon/ TODO: Add extra initialization hereCheckRadioButton(IDC_MD5_RADIO,IDC_SHA1_RADIO,IDC_MD5_RADIO);UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid DMyDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.Do

16、Modal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void DMyDlg:OnPaint() if (IsIconic()CPaintDC dc(this);

17、 / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height()

18、- cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR DMyDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void DMyDlg:OnButtonGet() / TODO: Add your control notificatio

19、n handler code hereready=1;UpdateData(TRUE); CTime t0=CTime:GetCurrentTime();/*int len=8; /int len=2; modified in 2007 6. 9for(int i=0;im_Len;i+)len*=2;P.Mov(0);Q.Mov(0);N.Mov(0);E.Mov(0);P.GetPrime(len);Q.GetPrime(len);N.Mov(P.Mul(Q);N.Put(m_P);P.m_ulValue0-;Q.m_ulValue0-;P.Mov(P.Mul(Q);D.Mov(0x100

20、01);/mpdified in 2007.6.10/m_D=10001;/mpdified in 2007.6.10E.Mov(D.Euc(P);E.Put(m_Q); CTime t1=CTime:GetCurrentTime(); CTimeSpan t=t1-t0;m_OUT.Format(%d,t.GetTotalSeconds();m_OUT+= 秒;Q.m_ulValue0=0;*/CBigInt r,s,u,v4,w,p,q,t; /,H,G,X,Y;int n=3,b=31,L=512,g=160,T=1;t.Mov(pow2(2,g);while (T)s.Mov(make

21、randnumber(g);/r.Mov(s);/r.Mov(r.Add(1);/r.Mov(r.Mod(t);/u.Mov(sha(s);q.Mov(sha(s);q.m_ulValue0=q.m_ulValue0|0x1;q.m_ulValue4=q.m_ulValue4|0x80000000; while (q.Rab()=0) q.Mov(q.Add(2);int C=0,N=2;for (int k=0;k4;k+)vk.Mov(s);vk.Mov(vk.Add(N+k);vk.Mov(vk.Mod(t);vk.Mov(sha(vk);w.Mov(0);r.Mov(1);for (

22、k=0;k3;k+)vk.Mov(vk.Mul(r);w.Mov(w.Add(vk);r.Mov(r.Mul(t);s.Mov(pow2(2,b);vk.Mov(vk.Mod(s);vk.Mov(vk.Mul(r);w.Mov(w.Add(vk);r.Mov(w);r.Mov(r.Add(1);w.Mov(w.Mod(q);r.Mov(r.Sub(w);p.Mov(r);while (p.Rab()=0) C=C+1;N=N+n+1;if (C=4096) break;p.Mov(p.Add(q);p.Mov(p.Add(q);if (C256)m_OUT=_T(N不得大于256位);Upda

23、teData(FALSE);return;K.Mov(makerandnumber(160);R.Mov(G.RsaTrans(K,P);R.Mov(R.Mod(Q);S.Mov(K.Euc(Q);g.Get(m_IN);t.Mov(X.Mul(R);t.Mov(t.Mod(Q);t.Mov(t.Add(g);S.Mov(S.Mul(t);S.Mov(S.Mod(Q);R.Put(m_OUT);S.Put(m_S);/*for(int i=0;im_IN.GetLength();i+)if(m_INi9)&(m_INiF)&(m_INif)m_OUT=_T(待加密数据必须为0-9或A-F或a-

24、f组成的整数);UpdateData(FALSE);return;*/P.Get(m_IN);/if(P.Cmp(N)=0)/m_OUT=_T(待加密数据必须小于N);/ UpdateData(FALSE);/return;/Q.Mov(P.RsaTrans(E,N);/Q.Put(m_OUT);UpdateData(FALSE);void DMyDlg:OnDecrypt() CBigInt W,U1,U2,t;/ TODO: Add your control notification handler code hereif(ready=0)|(Q.m_ulValue0=0)m_OUT=_T

25、(请先进行数字签名); UpdateData(FALSE);return;W.Mov(S.Euc(Q);U1.Get(m_IN);U1.Mov(U1.Mul(W);U1.Mov(U1.Mod(Q);U2.Mov(R.Mul(W);U2.Mov(U2.Mod(Q);V.Mov(G.RsaTrans(U1,P);V.Mov(V.Mod(P);t.Mov(Y.RsaTrans(U2,P);t.Mov(t.Mod(P);V.Mov(V.Mul(t);V.Mov(V.Mod(P);V.Mov(V.Mod(Q);if (V.Cmp(R)=0) V.Put(m_V);R.Put(m_V);/Q.Get(m_

26、OUT);/P.Mov(Q.RsaTrans(D,N);/P.Put(m_OUT);UpdateData(FALSE);void DMyDlg:OnBtnfile() / TODO: Add your control notification handler code hereCFileDialog m_FileOpen(TRUE); /设置打开窗体的标题 m_FileOpen.m_ofn.lpstrTitle = _T(打开文件); m_FileOpen.m_ofn.lpstrFilter = _T(文件 (*.*)0*.*00); /点击浏览按钮 if(IDOK = m_FileOpen.

27、DoModal() /获取打开的文件路径 CString m_FileName = m_FileOpen.GetPathName(); CEdit* pEdit = (CEdit*)(GetDlgItem(IDC_EDITFILE); /将选择的文件路径名显示到IDC_EDITFILE表识的EDIT中 pEdit-SetWindowText(m_FileName); void byte2strhash(unsigned char *hash,int hashlen,unsigned char *out)int i,x,y;for (i = 0;i 4;y += 0x30;if (y 0x39)

28、 y+= 0x07;x = hashi & 0x0F;x += 0x30;if (x 0x39) x+= 0x07;outi 1 = y;out(i 1)+1 = x;outhashlen 1 = 0x00;void DMyDlg:OnChangeEditfile() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl()

29、.SetEventMask()/ with the ENM_CHANGE flag ORed into the mask./ TODO: Add your control notification handler code hereUpdateData(TRUE); CString open=m_file; MD5_CTXmd5_ctx; SHA1_CTX sha1_ctx;int hashradio; hashradio=GetCheckedRadioButton(IDC_MD5_RADIO,IDC_SHA1_RADIO);if(hashradio=IDC_MD5_RADIO) /MD5 i

30、nt i;unsigned char digest16,output16;FILE* file; unsigned char buffer16384; MD5Init(&md5_ctx);file = fopen(open, rb); i = fread(buffer, 1, 16384, file); MD5Update(&md5_ctx, buffer, i); MD5Final(digest, &md5_ctx); fclose(file);byte2strhash(digest,16,output);CString str(output);SetDlgItemText(IDC_INPU

31、T,str);else /SHA-1int i;unsigned char digest20,output20;FILE* file; unsigned char buffer16384; SHA1Init(&sha1_ctx);file = fopen(open, rb); i = fread(buffer, 1, 16384, file); SHA1Update(&sha1_ctx, buffer, i); SHA1Final(digest, &sha1_ctx); fclose(file);byte2strhash(digest,20,output);CString str(output);SetDlgItemText(IDC_INPUT,str);void DMyDlg:OnChangeString() / TODO: If this is a RIC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号