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

📄 kasumi.cpp

📁 第三代移动系统中以Kasumi为内核的另一加密算法-f8算法的VC++实现
💻 CPP
字号:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdafx.h>

// s7盒
static const s7[128]={
	54,50,62,56,22,34,94,96,38,6,63,93,2,18,123,33,
	55,113,39,114,21,67,65,12,47,73,46,27,25,111,124,81,
	53,9,121,79,52,60,58,48,101,127,40,120,104,70,71,43,
	20,122,72,61,23,109,13,100,77,1,16,7,82,10,105,98,
	117,116,76,11,89,106,0,125,118,99,86,69,30,57,126,87,
	112,51,17,5,95,14,90,84,91,8,35,103,32,97,28,66,
	102,31,26,45,75,4,85,92,37,74,80,49,68,29,115,44,
	64,107,108,24,110,83,36,78,42,19,15,41,88,119,59,3
};

// s9盒
static const s9[512]={
	167,239,161,379,391,334,9,338,38,226,48,358,452,385,90,397,
	183,253,147,331,415,340,51,362,306,500,262,82,216,159,356,177,
	175,241,489,37,206,17,0,333,44,254,378,58,143,220,81,400,
	95,3,315,245,54,235,218,405,472,264,172,494,371,290,399,76,
	165,197,395,121,257,480,423,212,240,28,462,176,406,507,288,223,
	501,407,249,265,89,186,221,428,164,74,440,196,458,421,350,163,
	232,158,134,354,13,250,491,142,191,69,193,425,152,227,366,135,
	344,300,276,242,437,320,113,278,11,243,87,317,36,93,496,27,
	487,446,482,41,68,156,457,131,326,403,339,20,39,115,442,124,
	475,384,508,53,112,170,479,151,126,169,73,268,279,321,168,364,
	363,292,46,499,393,327,324,24,456,267,157,460,488,426,309,229,
	439,506,208,271,349,401,434,236,16,209,359,52,56,120,199,277,
	465,416,252,287,246,6,83,305,420,345,153,502,65,61,244,282,
	173,222,418,67,386,368,261,101,476,291,195,430,49,79,166,330,
	280,383,373,128,382,408,155,495,367,388,274,107,459,417,62,454,
	132,225,203,316,234,14,301,91,503,286,424,211,347,307,104,374,
	35,103,125,427,19,214,453,146,498,314,444,230,256,329,198,285,
	50,116,78,410,10,205,510,171,231,45,139,467,29,86,505,32,
	72,26,342,150,313,490,431,238,411,325,149,473,40,119,174,355,
	185,233,389,71,448,273,372,55,110,178,322,12,469,392,369,190,
	1,109,375,137,181,88,75,308,260,484,98,272,370,275,412,111,
	336,318,4,504,492,259,304,77,337,435,21,357,303,332,483,18,
	47,85,25,497,474,289,100,269,296,478,270,106,31,104,433,84,
	414,486,394,96,99,154,511,148,413,361,409,255,162,215,302,201,
	266,351,343,144,441,365,108,298,251,34,182,509,138,210,335,133,
	311,352,328,141,396,346,123,319,450,281,429,228,443,481,92,404,
	485,422,248,297,23,213,130,466,22,217,283,70,294,360,419,127,
	312,377,7,468,194,2,117,295,463,258,224,447,247,187,80,398,
	284,353,105,391,299,471,470,184,57,200,348,63,204,188,33,451,
	97,30,310,219,94,160,129,493,64,179,263,102,189,207,114,402,
	438,477,387,122,192,42,3815,145,118,180,449,293,323,136,380,
	43,66,60,455,341,445,202,432,8,237,15,376,436,464,59,461
};

// fi轮回次数t,FO轮回次数s
int t,s;

// 字符变换成数字
int hextoint(char x)
{
	// 使得小写字母符号变成大写字母符号
	x = toupper(x);
	// 把十六进制字符化为十进制数
	if (x >= 'A' && x <= 'F')
	return x-'A'+10;
	else if (x >= '0' && x <= '9')
	return x-'0';
	exit(1);
}


// 数字变成字符
char inttohex(int x)
{
	if (x >= 0 && x <= 9)
		return x+'0';
	else if (x >= 10 && x <= 15)
		return x-10+'A';
	exit(1);
}


// 子函数FI,in为输入数据,rk为子密钥
unsigned short * FI(unsigned short in[4] ,unsigned short rk[8][8])
{
	unsigned short temp[5];

	temp[0] = in[0]>>7;
	temp[1] = in[0]<<9;
	temp[1] = temp[1]>>9;
	temp[2] = rk[t][s+4]>>9;
	temp[3] = rk[t][s+4]<<7;
	temp[3] = temp[3]>>7;

	temp[4] = temp[0];
	temp[0] = temp[1];
	temp[1] = s9[temp[4]]^temp[1];

	temp[4] = temp[0];
	temp[0] = temp[1]^temp[3];
	temp[1] = s7[temp[4]]^(temp[1]&127)^temp[2];

	temp[4] = temp[0];
	temp[0] = temp[1];
	temp[1] = s9[temp[4]]^temp[1];

	temp[4] = temp[0];
	temp[0] = s7[temp[0]]^(temp[1]&127);
	temp[1] = temp[4];

	in [1] = (temp[0]<<9) + temp[1];
	
	return in;
}		
	
	
// 子函数FL,in为输入数据,rk为子密钥
unsigned short * FL(unsigned short in[4] ,unsigned short rk[8][8])
{		
	in[1] = in[1] ^ ( ( (in[0]&rk[t][0]) >>15) + ( (in[0]&rk[t][0]) <<1) );
	in[0] = in[0] ^ ( ( (in[1]|rk[t][1]) >>15) + ( (in[1]|rk[t][1]) <<1) );
	return in;
}


// 子函数FO,in为输入数据,rk为子密钥
unsigned short * FO(unsigned short in[4] ,unsigned short rk[8][8])
{
	for (s = 1; s <= 3; s++)
	{	
		unsigned short temp;
		temp = in[0];
		in[0] = in[1];
		in[1] = temp^rk[t][s+1];
		FI(in,rk);
		in[1] = in[1]^in[0];
	}
	return in;
}


// 轮函数fi
void fi(unsigned short in[4],unsigned short rk[8][8])
{
	if((t+1)%2 == 0)
		FO(FL(in,rk),rk);
	else
		FL(FO(in,rk),rk);
}


// Kasumi分组加密算法
void Kasumi(char* I,const char* K)
{
	int i;
	unsigned short in[4] = {0,0,0,0}, k[8] = {0,0,0,0,0,0,0,0};
	unsigned short ck[8];
	unsigned short rk[8][8];
	unsigned short temp[2];
 
	for (i = 0; i<16; i++)
		in[i/4] += (hextoint(I[i])<<(4*(3-i%4)));
	for (i = 0; i<32; i++)
		k[i/4] += (hextoint(K[i])<<(4*(3-i%4)));

	int c[8] = {0+(1<<8)+(2<<4)+3,(4<<12)+(5<<8)+(6<<4)+7,(8<<12)+(9<<8)+(10<<4)+11,(12<<12)+(13<<8)+(14<<4)+15,(15<<12)+(14<<8)+(13<<4)+12,(11<<12)+(10<<8)+(9<<4)+8,(7<<12)+(6<<8)+(5<<4)+4,(3<<12)+(2<<8)+(1<<4)+0};
	for(i = 0; i < 8; i++)
		ck[i] = k[i]^c[i];
	
	// 轮密钥rk的生成
	for(i = 0; i < 8; i++)
	{
		rk[0][i] = (k[i]>>15)+(k[i]<<1);
		rk[1][i] = ck[(i+2)%8];
		rk[2][i] = (k[(i+1)%8]>>11)+(k[(i+1)%8]<<5);
		rk[3][i] = (k[(i+5)%8]>>8)+(k[(i+5)%8]<<8);
		rk[4][i] = (k[(i+6)%8]>>3)+(k[(i+5)%8]<<13);
		rk[5][i] = ck[(i+4)%8];
		rk[6][i] = ck[(i+3)%8];
		rk[7][i] = ck[(i+7)%8];
	}


	for(t = 0; t < 8; t++)
	{	
		temp[0] = in[0];
		temp[1] = in[1];
		fi(in,rk);
		in[0] = in[2]^in[0];
		in[1] = in[3]^in[1];
		in[2] = temp[0];
		in[3] = temp[1];
	}


	for(i = 0; i < 4; i++)
	{
		// in[i]是16bit
		I[0+i*4] = inttohex(in[i]>>12);
		temp[0] = in[i]<<4;
		I[1+i*4] = inttohex(temp[0]>>12);
		temp[0] = in[i]<<8;
		I[2+i*4] = inttohex(temp[0]>>12);
		temp[0] = in[i]<<12;
		I[3+i*4] = inttohex(temp[0]>>12);
	}
}

⌨️ 快捷键说明

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