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

📄 genkey.cpp

📁 aes的原代码
💻 CPP
字号:
#include "StdAfx.h"
#include ".\genkey.h"
/**
 * 散列构造器,有机器码
 * 本类可根据 机器码,用户名,口令或只用用户名,口令散列出固定128位的序列,用于NewHash类的散列密钥
 * 参数:
 *  pcstr 机器码
 *  username 用户名
 *  psw 用户口令
 *  len1 pcstr有效长度
 *  len2 username有效长度
 *  len3 psw有效长度
 */
GenKey::GenKey(unsigned char *pcstr, unsigned char *username, unsigned char *psw, int len1, int len2, int len3)
{
	key= new unsigned char[FIN_KEY_LEN];
	count=0;
	/*this->pcstr = pcstr;
	this->username = username;
	this->psw = psw;*/
	unfold(pcstr,len1);				//将序列按1,0二进制形式展开,下同
	unfold(username,len2);
	unfold(psw,len3);
	fillTest();						//如果不够128位,则进行填充,主要防止没有机器码是位数不够,因为机器码一般有几百位
}
/**
 * 散列构造器,无机器码
 * 参数:
 *  pcstr 机器码
 *  username 用户名
 *  len1 pcstr有效长度
 *  len2 username有效长度
 */
GenKey::GenKey(unsigned char *pcstr, unsigned char *username, int len1, int len2)
{
	key= new unsigned char[FIN_KEY_LEN];
	count=0;
	unfold(pcstr,len1);			//将序列按1,0二进制形式展开,下同
	unfold(username,len2);
	fillTest();						//如果不够128位,则进行填充,主要防止没有机器码是位数不够,因为机器码一般有几百位
	/*this->username = username;
	this->psw = psw;*/
	/*stmp = seed;
	memcpy(stmp,username,len2);
	stmp+=len2;
	memcpy(stmp,psw,len3);*/
}
/**
 * 取得散列后的序列
 * 参数:
 *  keybuf  存储序列的数组
 * 返回:
 *  存储序列的数组指针
 */
unsigned char *GenKey::getKey(unsigned char *keybuf)
{
	selByte();						//筛选
	compressKey();					//把128位二进制1,0序列重新压缩到16个字节序列里
	memcpy(keybuf,key,FIN_KEY_LEN);
	return keybuf;
}
/**
 * 把char数组扩展到二进制形式的数组
 * 参数:
 *  source 待展开的序列
 *  len 序列的长度
 */
void GenKey::unfold(unsigned char *source, int len) 
{
	unsigned char ch=0x80;
	for(int i=0; i<len; i++)
	{
		for(int l=0; l<8; l++)
		{
			seed[count++] = ((source[i] << l) & ch) >> 7;
		}
	}
	/*for(int i=0; i<len; i++) printf("%x-",source[i]);
	//printf("-->>\n");*/
	//for(int i=0; i<count; i++) printf("%d-",seed[i]);
	//printf("==seed\n");
	//printf("%d==\n",count);
}
/**
 * 如果展开后的序列不够128位,则要进行填充
 */
int GenKey::fillTest()
{
	if(count<GEN_KEY_LEN)
	{
		int rel= GEN_KEY_LEN-count;
		int l;
		for(int i=count; i<GEN_KEY_LEN; i++)
		{
			l=modPow((i+1)*rel*PN,count*PN,i);
			seed[i]=seed[l];
		}
		count=GEN_KEY_LEN;
		return 1;
	}
	return 0;
}
/**
 * 计算a的b次方mod c 的值,用于以上填充时增加随机度
 */
int GenKey::modPow(int a,int b,int c)
{
    int r=1;
    while(b)
	{
        if (b&1) r=(r*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return r;
}
/**
 * 根据一定规则筛选出128二进制序列
 */
void GenKey::selByte()
{
	int e=2;
	int flag=1;
	int t=0;
	while(flag)
	{
		for(int i=0; e*i+1<count; i++)
		{
			if(count-t<=128){flag=0; break;}
			if(seed[e*i+1]!=-1) t++;
			seed[e*i+1] = -1;
		}
		e++;
		//printf("%d== ",e);
	}
	for(int i=0, t=0; i<count; i++)
	{
		if(seed[i]!=-1) stmp[t++]=seed[i];
	}
	/*for(int i=0; i<128; i++){printf("%d-",stmp[i]);if((i+1)%8==0) printf("^");}
	printf("=stmp\n");*/
}
/**
 * 把128位二进制1,0序列重新压缩到16个字节序列里
 */
void GenKey::compressKey()
{
	int l;
	//memset(key,0,sizeof(key));
	for(int i=0; i<FIN_KEY_LEN; i++) key[i]=0;
	for(int i=0; i<GEN_KEY_LEN; i++)
	{
		l = i/8;
		key[l]+=stmp[i];
		if((i+1)%8!=0) key[l]<<=1;
		//printf("%x-%d>",key[l],stmp[i]);
		//if((i+1)%8==0) printf("\n");
	}
	/*printf("\n");
	for(int i=0; i<16; i++) printf("%x-",key[i]);
	printf("=key\n");*/
}
GenKey::~GenKey(void)
{
	delete[] key;
}

⌨️ 快捷键说明

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