📄 ssf43.c
字号:
//求出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 + -