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

📄 newhash.cpp

📁 aes的原代码
💻 CPP
字号:
#include "StdAfx.h"
#include ".\newhash.h"
/**
 * 散列构造器,有机器码
 * 本类可根据 机器码,用户名,口令或只用用户名,口令散列出指定位的序列
 * 参数:
 *  pcstr 机器码
 *  username 用户名
 *  psw 用户口令
 *  len1 pcstr有效长度
 *  len2 username有效长度
 *  len3 psw有效长度
 *  keyLen 须散列后序列的位数,缺省为 128位
 */
NewHash::NewHash(unsigned char *pcstr, unsigned char *username, unsigned char *psw, int len1, int len2, int len3, int keyLen)
{
	if(keyLen!=128 && keyLen!=192 && keyLen!=256) throw exception("密钥长度无效");	//密钥长度无效异常
																					//密钥长度必须是128或192或256位
	try{
		genKey = new GenKey(pcstr,username,psw,len1,len2,len3);
		buffer = new unsigned char[len1+len2+len3];
		unsigned char *tp = buffer;
		memcpy(tp,pcstr,len1);
		tp+=len1;
		memcpy(tp,username,len2);
		tp+=len2;
		memcpy(tp,psw,len3);
		count=len1+len2+len3;
		this->keyLen=keyLen;
		initial();						//基本数据初始化
		flg=false;
	}catch(exception& ex)
	{
		delete (genKey);
		delete[] buffer;
		throw ex;
	}
}
/**
 * 散列构造器,无机器码
 * 参数:
 *  pcstr 机器码
 *  username 用户名
 *  len1 pcstr有效长度
 *  len2 username有效长度
 *  keyLen 须散列后序列的位数,缺省为 128位
 */
NewHash::NewHash(unsigned char *pcstr, unsigned char *username, int len1, int len2, int keyLen)
{
	if(keyLen!=128 && keyLen!=192 && keyLen!=256) throw exception("密钥长度无效");
	try{
		genKey = new GenKey(pcstr,username,len1,len2);
		buffer = new unsigned char[len1+len2];
		unsigned char *tp = buffer;
		memcpy(tp,pcstr,len1);
		tp+=len1;
		memcpy(tp,username,len2);
		count=len1+len2;
		this->keyLen=keyLen;
		initial();
		flg=false;
	}catch(exception& ex)
	{
		delete (genKey);
		delete[] buffer;
		throw ex;
	}
}
/**
 * 取的散列后指定位数的序列,进行此方法调用时必须进行iniKey方法的调用初始化,否则函数体内将抛出异常
 * 参数:
 *  finkey 存储最终散列序列,要求大小务必大于等于keyLen
 * 返回:finkey 存储最终散列序列指针
 */
unsigned char *NewHash::getKey(unsigned char *finkey)
{
	if(!flg) throw exception("从未初始化的序列!");
	if(strlen((char*)((void*)finkey))<(size_t)keyLen/8) throw exception("密钥参数数组越界!");
	unsigned char *reh; 
	switch(keyLen)							//根据指定的不同的散列序列位数进行处理
	{
	case 128: //finkey= new unsigned char[SL];
		if(ha[SL-1]%2) memcpy(finkey,ha,SL);
		else memcpy(finkey,hb,SL);
		return finkey;
	case 192:
		//finkey= new unsigned char[SL+8];
		reh=finkey;
		memcpy(reh,ha,16);
		reh+=16;
		memcpy(reh,hb,8);
		return finkey;
	case 256:
		//finkey= new unsigned char[2*SL];
		reh=finkey;
		memcpy(reh,ha,16);
		reh+=16;
		memcpy(reh,hb,16);
		return finkey;
	default: throw exception("密钥长度无效");
	}
}
/**
 * 进行基本数据结构及数据的初始化,在构造函数里调用
 */
void NewHash::initial()
{
	unsigned char *tp,*tk;
	int n;
	mecnt=0;
	tp=buffer;
	genKey->getKey(key);
	memset(m,0,sizeof(m));
	memset(me,0,sizeof(me));
	for(int i=0; i<count; i+=16,tp+=16)					//初始化me(由m经过aes加密得)
	{
		n =( count -i > 16 ) ? 16 : ( count - i );
		memcpy(m[mecnt],tp,n);
		AesCrypt::rijCrypt(m[mecnt],me[mecnt],key,16);
		mecnt++;
	}
	tk=key;
	memcpy(k1,tk,SUBKL);
	tk+=SUBKL;
	memcpy(k2,tk,SUBKL);
	//printf("-=%d=-\n",mecnt);
	/*for(int i=0; i<mecnt; i++)
	{
		for(int j=0; j<16; j++) printf("%x-",me[i][j]);
		printf("\n");
	}*/
}
/**
 * 散列的核心,进行散列的基本过程,调用getKey方法前必须先调用此方法
 */
void NewHash::iniKey()
{
	flg=true;
	unsigned char tmp[SL];
	memset(ha,0,sizeof(ha));
	memset(hb,0,sizeof(hb));
	memcpy(ha,k1,SUBKL);
	memcpy(hb,k2,SUBKL);
	for(int i=0; i<mecnt; i++)
	{
		xor(tmp,ha,me[i],SL);
		AesCrypt::rijCrypt(m[i],r,tmp,16);		//对称加密,使其更随机
		xor(r,r,me[i],SL);

		xor(tmp,hb,m[i],SL);
		xor(tmp,tmp,r,SL);
		AesCrypt::rijCrypt(me[i],re,tmp,16);	//对称加密,使其更随机
		xor(re,re,m[i],SL);
		
		memcpy(tmp,ha,SL);
		xor(ha,ha,hb,SL);
		xor(ha,ha,re,SL);
		xor(ha,ha,r,SL);
		
		xor(hb,tmp,hb,SL);
		xor(hb,hb,r,SL);

		//memcpy(tmp,ha,SL);
		//ha^=me[i];
		//AesCrypt::rijCrypt(m[i],r,ha,16);
		//r^=me[i];

		//memcpy(tmp1,hb,SL);
		//hb^=m[i];
		//hb^=r;
		//AesCrypt::rijCrypt(me[i],re,hb,16);
		//re^=m[i];

		//memcpy(ha,tmp,SL);
		//ha^=hb;
		//ha^=re;
		//ha^=r;

		//memcpy(hb,tmp1,SL);
		//hb^=tmp, hb^=r;
	}
}
/**
 * 进行两个序列的异或运算
 */
void NewHash::xor(unsigned char *buf, unsigned char *a, unsigned char *b, int l)
{
	for(int i=0; i<l; i++)
	{
		buf[i]=a[i]^b[i];			//逐个元素异或
	}
}

NewHash::~NewHash(void)
{
	delete (genKey);
	delete[] buffer;
}

⌨️ 快捷键说明

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