⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa.cpp

📁 本程序实现DSA数字签名 是学习和研究密码学的良好资源 欢迎下载
💻 CPP
字号:

#include "stdafx.h"
#include <string.h>		
#include <stdio.h>
#include "BigInt.h"
#include "sha1.h"
#include "time.h"

int shas1(const unsigned int x[], unsigned char digest[20])
{
	SHA1_CTX context;
	unsigned char buffer[16384]; //,digest[20];
//	FILE *file; 
    SHA1Init(&context);
	SHA1Update(&context, buffer, 1);
    SHA1Final(digest, &context);
    return 0;
}

CBigInt sha(CBigInt y)
{
	SHA1_CTX context;
    CBigInt X;
	unsigned char buffer[16384],digest[20];
    CString str;
	char *t="0123456789ABCDEF";
	if((y.m_nLength==1)&&(y.m_ulValue[0]==0))
	{
		str="0";
		X.Mov(0);
		return X;
	}
	str="";
    int a;
    char ch='\0';
	str.Insert(0,ch);
    X.Mov(y);
    while(X.m_ulValue[X.m_nLength-1]>0)
    {
        a=X.Mod(16);
        ch=t[a];
        str.Insert(0,ch);
        X.Mov(X.Div(16));
    }
	int i=0;
	while (str[i]>0) 
		i++;
	for (a=i,i=0;i<a;i++)
		buffer[i]=str[i];
	for (i=a;i<64;i++) buffer[i]='\0';
    SHA1Init(&context);
	SHA1Update(&context, buffer, 1);
    SHA1Final(digest, &context);
    int len=str.GetLength(),k;
    X.Mov(0);
    for(i=0;i<20;i++)
    {
       X.Mov(X.Mul(256));
//       if((digest[i]>='0')&&(digest[i]<='9'))
	   k=digest[i];
//       else if((digest[i]>='A')&&(digest[i]<='F'))k=digest[i]-55;
//       else if((digest[i]>='a')&&(digest[i]<='f'))k=digest[i]-87;
//       else k=0;
       X.Mov(X.Add(k));
    }
	return X;
}

CBigInt makerandnumber( unsigned int len)
{
	srand(time(NULL));
    CBigInt X;
	X.m_nLength=(len+31)/32;
//    X.Mov(0);
	for (unsigned int j=0;j<X.m_nLength;j++)
	{
		X.m_ulValue[j]=rand()*0x10000+rand();
	}
	X.m_ulValue[0]=X.m_ulValue[0]|0x1; 
	X.m_ulValue[j-1]=X.m_ulValue[j-1]|0x80000000; 
	return X;
}

CBigInt pow2( const int x, int y)
{
	CBigInt p,q,t;
	p.Mov(1);
	q.Mov(x);
	while (y>0)
	{
		if (y%2==0) {q.Mov(q.Mul(q)); y /= 2 ;  }
		else { p.Mov(p.Mul(q)); y -= 1; }
	}
	return p;
}

CBigInt pow3(CBigInt x, CBigInt y, CBigInt m)
{
	CBigInt p,t;
	p.Mov(1);
	t.Mov(0);
	while (y.Cmp(t)>0)
	{
		if (y.m_ulValue[0]&0x1==0) 
			{x.Mov(x.Mul(x)); x.Mov(x.Mod(m)); x.Mov(x.Div(2)); }
		else {p.Mov(p.Mul(x)); p.Mov(p.Mod(m)); y.Mov(y.Sub(1)); }
	}
	return p;
}

/*
void dsa()
{
	CBigInt r,s,u,v[4],w,p,q,t;
	t.Mov(pow2(2,160));
	int n=3,b=31,L=512,g=160,T=1;
	while (T)
	{
		while (T)
		{
			s.Mov(makerandnumber(g));
			r.Mov(s);
			r.Mov(r.Add(1));
			r.Mov(r.Mod(t));
			u.Mov(sha(s));
			q.Mov(sha(r));
			for (int i=0;i<5;i++)
				q.m_ulValue[i]=q.m_ulValue[0]^u.m_ulValue[i]; 
			if (q.Rab()) break;
		}
		int C=0,N=2;
		while (T)
		{
//			v[4],w,p;
			for (int k=0;k<4;k++)
			{
				v[k].Mov(s);
				v[k].Mov(v[k].Add(N+k));
				v[k].Mov(v[k].Mod(t));
				v[k].Mov(sha(v[k]));
			}
			w.Mov(0);
			r.Mov(1);
			for ( k=0;k<3;k++)
			{
				v[k].Mov(v[k].Mul(r));
				w.Mov(w.Add(v[k]));
				r.Mov(r.Mul(t));
			}
			v[k].Mov(v[k].Mod(0x80000000));
			v[k].Mov(v[k].Mul(r));
			w.Mov(w.Add(v[k]));
			r.Mov(w);
			r.Mov(r.Add(1));
			w.Mov(w.Mod(q));
			r.Mov(r.Sub(w));
			p.Mov(r);
			if (p.Rab()) break;
			C=C+1;
			N=N+n+1;
			if (C==4096) break;
		}
		if (C<4096) break;		
	}
}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -