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

📄 blowfish.c

📁 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 + -