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

📄 symmcrypt.c

📁 一种的著名的加解密算法ssf43. 国家密码管理委员会办公室批准的用于WLAN的SSF43对称分组加密算法.
💻 C
字号:
#include "ssf43.h"
#include "SymmCrypt.h"

int j = 0;

//产生随机数
//存在问题,有待改进
int wpiGenRandom(bit16 i_length, PWPI_DATA o_random)
{
	int ret = 0;
	bit16 random;
	int cur_time;
	bit32 i;
	
	for(i=0L; i<i_length; i=i+2)
	{		
		cur_time = time(NULL)+getpid();
		srand( (cur_time<<j) | (cur_time>>j) );
		random = (bit16)rand();
		o_random->value[i] = random & 0xff;
		o_random->value[i+1] = (random>>8) & 0xff;
		j++;
	}

	o_random->size = i_length;

	return ret;
}

//作用:生成对称密钥
int wpiGenSymmKey(WPI_DATA i_random1, WPI_DATA i_random2, PWPI_DATA o_symmKey)
{
	int ret = 0;
	bit32 i;
	bit32 length;

	if(i_random1.size <= i_random2.size)
		length = i_random1.size;
	else
		length = i_random2.size;

	for(i=0L; i<length; i++)
	{
		o_symmKey->value[i] = (i_random1.value[i]) ^ (i_random2.value[i]);
	}
	o_symmKey->size = length;

	return ret;
}

//作用:加密,解密128Bit
int wpiSymmCryptData(int i_isEncrypt, WPI_DATA i_symmKey, WPI_DATA i_inData, PWPI_DATA o_outData)
{
	int ret = 0;
	bit32 i = 0L;
	bit32 k = 0L;
	bit32 length = 0;
	bit32 residual = 0;
	bit32 g_enKey[KEYLEN*2];
	bit32 g_deKey[KEYLEN*2];
	bit8 key[16];
	bit8 buf1[16];
	bit8 buf2[16];	
	bit8 *in;
	bit8 *out;

	for(k=0L; k<KEYLEN*2; k++)
		g_enKey[k] = 0;
	
	if(i_symmKey.size >= 16)
	{
		for(k=0L; k<16; k++)
			key[k] = i_symmKey.value[k];
	}
	else
	{
		for(k=0L; k<i_symmKey.size; k++)
			key[k] = i_symmKey.value[k];
		for(k=i_symmKey.size; k<16; k++)
			key[k] = 0;
	}
	en_key_ssf43(key, g_enKey);
	
	in = i_inData.value;
	out = o_outData->value;
	length = i_inData.size / 16;	
	residual = i_inData.size % 16;	
	if(i_isEncrypt)
	{			
		if(residual!=0)
			length++;
		for(i=0; i<length-1; i++)
		{												
			for(k=0; k<16; k++)
				buf1[k] = in[k];			
	
			cipher_ssf43(g_enKey, buf1, buf2);

			for(k=0; k<16; k++)
				out[k] = buf2[k];
			
			in += 16;
			out += 16;			
		}
		if(residual == 0)		
		{
			for(k=0L; k<16; k++)
				buf1[k] = in[k];					
			
			cipher_ssf43(g_enKey, buf1, buf2);
			for(k=0; k<16; k++)
				out[k] = buf2[k];
			
			out += 16;
			for(k=0; k<16; k++)
				buf1[k] = 16;
			
			cipher_ssf43(g_enKey, buf1, buf2);
			for(k=0L; k<16; k++)
				out[k] = buf2[k];
			
			o_outData->size = (length+1) * 16;
		}
		else
		{
			for(k=0; k<residual; k++)
				buf1[k] = in[k];
			for(k=residual; k<16; k++)
				buf1[k] = (bit8)((16-residual) & 0xffL);
			cipher_ssf43(g_enKey, buf1, buf2);
			for(k=0; k<16; k++)
				out[k] = buf2[k];	
			o_outData->size = length * 16;
		}				
	}
	else
	{		
		if(residual != 0)
			return BAD_DATA_FORMAT;

		for(k=0; k<KEYLEN*2; k++)
			g_deKey[k] = 0;
		
		de_key_ssf43(g_enKey, g_deKey);
					
		for(i=0L; i<length-1; i++)
		{									
			for(k=0L; k<16; k++)
				buf1[k] = in[k];				
	
			cipher_ssf43(g_deKey, buf1, buf2);
			for(k=0L; k<16; k++)
				out[k] = buf2[k];
			in += 16;
			out += 16;
		}	
		for(k=0L; k<16L; k++)
			buf1[k] = in[k];				
	
		cipher_ssf43(g_deKey, buf1, buf2);
		for(k=0L; k<16L; k++)
			out[k] = buf2[k];
		
		o_outData->size = length*16 - out[k-1];

		if(out[k-1] <= 16)
		{
			for(k=(bit32)(16-out[k-1]); k<16; k++)
				out[k] = 0;
		}		
	}	

	return ret;
}


⌨️ 快捷键说明

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