📄 blowfish.c
字号:
#include <stdio.h>
#include <string.h>
#include "blowfish.h"
void BlowFishPro(UINT32 * input, UINT32 * output, UINT8 codeflg);
void BF_EN(UINT32 left,UINT32 right,UINT32 * ptrtmp);
UINT32 Fun(UINT32 left);
void main(void)
{
UINT8 i;
memset(inputdata,0,sizeof(inputdata));
memset(outputdata,0,sizeof(outputdata));
for(i=0;i<4;i++)
{
inputdata[0] <<= 8;
inputdata[1] <<= 8;
inputdata[0] += C_Data[i];
inputdata[1] += C_Data[i+4];
}
printf("%08x ",inputdata[0]);
printf("%08x ",inputdata[1]);
printf("\n");
BlowFishPro(inputdata,outputdata,1); //1加密
printf("%08x ",outputdata[0]);
printf("%08x ",outputdata[1]);
printf("\n");
memset(inputdata,0,sizeof(inputdata));
BlowFishPro(outputdata,inputdata,0); //0解密
printf("%08x ",inputdata[0]);
printf("%08x ",inputdata[1]);
printf("\n");
}
void BlowFishPro(UINT32 * input, UINT32 * output, UINT8 codeflg)
{
UINT32 key,xleft,xright;
UINT8 i,pos;
UINT16 j;
UINT32 * ptrtmp, * ptrsbox;
key = 0;
pos = 0;
memcpy(key_sbox,sbox,sizeof(sbox)); //填充key_sbox
for(i=0;i<18;i++) //填充key_pbox
{
for(j=0;j<8;j++)
{
key <<= 8;
key += C_Key[pos++];
if(pos >= sizeof(C_Key)) pos = 0;
}
key_pbox[i] = pbox[i] ^ key;
}
if(codeflg == 0) //解密时,key_pbox逆序使用
{
UINT32 temp;
for(i=0;i<9;i++)
{
temp = key_pbox[i];
key_pbox[i] = key_pbox[17-i];
key_pbox[17-i] = temp;
}
}
xleft = xright = 0; //加密一个全0的64位信息
ptrtmp = key_pbox;
BF_EN(xleft,xright,ptrtmp); //输出的结果替换key_pbox[0]和key_pbox[1]
for(i=0;i<16;i+=2)
{ //直到key_pbox全部被替换
xleft = key_pbox[i];
xright = key_pbox[i+1];
ptrtmp = &key_pbox[i+2];
BF_EN(xleft,xright,ptrtmp);
}
xleft = key_pbox[16]; //用key_pbox[16]和key_pbox[17]做首次输入
xright = key_pbox[17];
ptrtmp = &key_sbox[0][0];
BF_EN(xleft,xright,ptrtmp);
ptrsbox = &key_sbox[0][0];
for(j=0;j<1024-2;j += 2)
{ //直到key_sbox全部被替换
xleft = *ptrsbox;
xright = *(ptrsbox + 1);
ptrtmp = ptrsbox + 2;
BF_EN(xleft,xright,ptrtmp);
ptrsbox += 2;
}
xleft = *input; //信息加密
xright = *(input + 1);
BF_EN(xleft,xright,output);
}
void BF_EN(UINT32 left,UINT32 right,UINT32 * ptrtmp)
{
UINT8 i;
UINT32 temp;
for(i=1;i<=16;i++)
{
left ^= key_pbox[i-1];
right = right ^ Fun(left);
if(i != 16)
{
temp = left;
left = right;
right = temp;
}
}
right ^= key_pbox[16];
left ^= key_pbox[17];
*ptrtmp = left;
ptrtmp++;
*ptrtmp = right;
}
UINT32 Fun(UINT32 left)
{
UINT8 column[4];
UINT32 result;
column[0] = (UINT8)(left >> 24);
column[1] = (UINT8)(left >> 16);
column[2] = (UINT8)(left >> 8);
column[3] = (UINT8)left;
// result = ((((sbox[0][column[0]] + sbox[1][column[1]]) % value2_32) ^ sbox[2][column[2]]) + sbox[3][column[3]]) % value2_32;
result = (((key_sbox[0][column[0]] + key_sbox[1][column[1]]) ^ key_sbox[2][column[2]]) + key_sbox[3][column[3]]);
return (result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -