?? symmcrypt.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 + -