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

📄 ssf43.c

📁 一种的著名的加解密算法ssf43. 国家密码管理委员会办公室批准的用于WLAN的SSF43对称分组加密算法.
💻 C
📖 第 1 页 / 共 2 页
字号:
	//求出A
	ULongToByte(in, A, 2);	
	
	//通过S盒求出A'
	S_box(A);

	//求出B
	/*
	B[0] = (A[1]<<8) | A[4];
	B[1] = (A[3]<<8) | A[6];
	B[2] = (A[0]<<8) | A[5];
	B[3] = (A[2]<<8) | A[7];
	*/
	B[0] = ((A[1]&0xffff)<<8) | A[4];
	B[1] = ((A[3]&0xffff)<<8) | A[6];
	B[2] = ((A[0]&0xffff)<<8) | A[5];
	B[3] = ((A[2]&0xffff)<<8) | A[7];
	//求出C'
	Cx[0] = B[1] + ( (B[2]<<1) | (B[2]>>15) );
	Cx[1] = B[0] + B[1];
	Cx[2] = B[0] + B[3];
	Cx[3] = B[2] + B[3];

	//求出C
	C[0] = (Cx[0]<<16) | Cx[1];
	C[1] = (Cx[2]<<16) | Cx[3];
	
	//求出D
	for(i=0; i<2; i++)
	{	
		D[i] = C[i] ^ (*l_key++);
	}

	//求出E
	E[0] = D[0] + (D[0] + D[1]);
	E[1] = ((D[0]+D[1]) >> 7) | ((D[0]+D[1]) << 25);
		
	for(i=0; i<2; i++)
		*out++ = E[i];
}

/****************************************************
 *【函数原型】:void en_key_ssf43(bit8 *m_key, bit32 *g_enKey)
 *【功能说明】:生成20个加密层密钥。
 *【参数说明】:
 * [IN] 	m_key为报文密钥。
 * [OUT]    g_enKey为加密层密钥分组。
 *【函数返回】:无。
******************************************************/
void en_key_ssf43(bit8 *m_key, bit32 *g_key)
{
	int i,j;
	bit32 X[2],Y[2],Z[2],key[2],A[4];
	bit32 *g_ckey;
	bit32 ckey[20];
	
	g_ckey = ckey;
	ByteToULong(CKEY, g_ckey, sizeof(CKEY));

	ByteToULong(m_key, X, 8);
	ByteToULong(m_key+8, Y, 8);	

	//生成K0,K1
	for(i=0; i<2; i++)
	{
		key[0] = *g_ckey++;
		key[1] = *g_ckey++;

		F(key, Y, Z);
		X[0] ^= Z[0];
		X[1] ^= Z[1];

		key[0] = *g_ckey++;
		key[1] = *g_ckey++;

		F(key, X, Z);
		Y[0] ^= Z[0];
		Y[1] ^= Z[1];
	}	
	for(i=0; i<2; i++)
	{
		A[i] = Y[i];
		*g_key++ = A[i];
	}
	for(i=0; i<2; i++)
	{
		A[i+2] = X[i];
		*g_key++ = A[i+2];
	}

	//生成K2...K9,K10...K17
	for(j=0; j<2; j++)
	{
		for(i=0; i<2; i++)
		{
			X[i] = A[i];
			Y[i] = A[i+2];
		}

		key[0] = *g_ckey++;
		key[1] = *g_ckey++;

		F(key, Y, Z);
		X[0] ^= Z[0];
		X[1] ^= Z[1];

		key[0] = *g_ckey++;
		key[1] = *g_ckey++;

		F(key, X, Z);
		Y[0] ^= Z[0];
		Y[1] ^= Z[1];

		A[0] = Y[0];
		A[1] = Y[1];
		A[2] = X[0];
		A[3] = X[1];

		for(i =0; i<4; i++)
		{
			X[0] = (A[3] << 21) | (A[0] >> 11);
			X[1] = (A[0] << 21) | (A[1] >> 11);
			Y[0] = (A[1] << 21) | (A[2] >> 11);
			Y[1] = (A[2] << 21) | (A[3] >> 11);
			*g_key++ = A[0] = X[0];
			*g_key++ = A[1] = X[1];
			*g_key++ = A[2] = Y[0];
			*g_key++ = A[3] = Y[1];
		}
	}

	//生成K18,K19
	for(i=0; i<2; i++)
	{
		X[i] = A[i];
		Y[i] = A[i+2];
	}

	key[0] = *g_ckey++;
	key[1] = *g_ckey++;

	F(key, Y, Z);
	X[0] ^= Z[0];
	X[1] ^= Z[1];

	key[0] = *g_ckey++;
	key[1] = *g_ckey++;

	F(key, X, Z);
	Y[0] ^= Z[0];
	Y[1] ^= Z[1];

	for(i=0; i<2; i++)
		*g_key++ = Y[i];

	for(i=0; i<2; i++)
		*g_key++ = X[i];
}

/****************************************************
 *【函数原型】:void de_key_ssf43(bit32 *g_enKey, bit32 * g_deKey)
 *【功能说明】:生成20个解密层密钥。
 *【参数说明】:
 * [IN] 	g_enKey为加密层密钥分组。
 * [OUT]    g_deKey为解密层密钥分组。
 *【函数返回】:无。
******************************************************/
void de_key_ssf43(bit32 *g_enKey, bit32 *g_deKey)
{	
	int i = 0;
	bit32 t1,t2,t3;
	bit16 keylen = KEYLEN;
	bit32 *ptemp = g_deKey + keylen;

	t1 = *g_enKey++;
	t2 = *g_enKey++;
	t3 = *g_enKey++;
	*--ptemp = *g_enKey++;
	*--ptemp = t3;
	*--ptemp = t2;
	*--ptemp = t1;

	i = 16;
	do{		
		t3 = *g_enKey++;
		*--ptemp = *g_enKey++;
		*--ptemp = t3;
	}while(--i);

	t1 = *g_enKey++;
	t2 = *g_enKey++;
	t3 = *g_enKey++;
	*--ptemp = *g_enKey++;
	*--ptemp = t3;
	*--ptemp = t2;
	*--ptemp = t1;	
}

/****************************************************
 *【函数原型】:void cipher_ssf43(bit32 *g_key, bit8 *in, bit8 *out)
 *【功能说明】:加密/解密功能。
 *【参数说明】:
 * [IN] 	g_key为加密或解密层密钥分组,40个32位数。
 * [IN] 	in为明文输入,为16字节。
 * [OUT]    out为密文输出,为16字节。
 *【函数返回】:无。
******************************************************/
void cipher_ssf43(bit32 *g_key, bit8 *in, bit8 *out)
{
	int i;
	int r = ROUNDS;	
	bit32 key[2],X[2],Y[2],Z[2];

	ByteToULong(in, X, 8);
	ByteToULong(in+8, Y, 8);		

	X[0] ^= *g_key++;
	X[1] ^= *g_key++;
	Y[0] ^= *g_key++;
	Y[1] ^= *g_key++;
	
	do{			
		key[0] = *g_key++;
		key[1] = *g_key++;

		F(key, Y, Z);
		X[0] ^= Z[0];
		X[1] ^= Z[1];

		key[0] = *g_key++;
		key[1] = *g_key++;

		F(key, X, Z);
		Y[0] ^= Z[0];
		Y[1] ^= Z[1];
	}while(--r);

	for(i=0; i<2; i++)
	{
		Y[i] ^= *g_key++;		
	}
	ULongToByte(Y, out, 2);	

	for(i=0; i<2; i++)
	{
		X[i] ^= *g_key++;		
	}
	ULongToByte(X, out+8, 2);		
}

⌨️ 快捷键说明

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