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

📄 s_box.cpp

📁 这是一个用VC.net实现的AES的S-box的实现代码
💻 CPP
字号:
// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <complex>
using namespace std;

const int ALen=256;	

//--------------------------------------------------------------------------------
//编程实现A表 power_tab[]=(03)的(ab)次方 mod p(x),//p(x)=x(8)+x(4)+x(3)+x+1,ab遍历0~255;
//以及实现B表 log_tab[],即交换power_tab的下标和赋值的次序
void Get_PowerTable_AND_LogTable(int power_tab[], int log_tab[])
{
	power_tab[0] = 0; power_tab[1] = 3;
	log_tab[0] = 0; log_tab[3] = 1;
	
	for (int ab=2; ab<ALen; ab++)
	{
		int temp = power_tab[ab-1] ^ (power_tab[ab-1]<<1);
		//如果结果小于256
		if (temp<=ALen)
		{
			power_tab[ab]=temp;
			log_tab[temp]=ab;
		}
		//否则	mod 283,283=(11B)=x(8)+x(4)+x(3)+x+1;
		else 
		{
			power_tab[ab] = temp ^ 0x11B;
			log_tab[temp ^ 0x11B] = ab;
		}
	}	
}//end of function Get_PowerTable_AND_LogTable()
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//由A表和B表求逆的最终结果temp_tab[]
void InverseTable(int power_tab[], int log_tab[], int temp_tab[])
{
	temp_tab[0] = 0; 
	temp_tab[1] = 1;
	for (int i=2; i < ALen; i++)
	{
		temp_tab[i] = power_tab[0xFF-log_tab[i]];	
	}
}//end of function InverseTable()
//-------------------------------------------------------------------------------


//----------------------------------------------------------------------------------
//求s_box
void s_box(int s_box_tab[])
{
	int power_tab[ALen];
	int log_tab[ALen];
	int temp_tab[ALen];	
	
	Get_PowerTable_AND_LogTable(power_tab, log_tab);
	InverseTable(power_tab, log_tab, temp_tab);

  //求仿射变换
	for (int i=0; i< ALen; i++)
	{
		int temp1 = ((temp_tab[i]&0x7f)<<1) ^ (temp_tab[i]>>7), 
			temp2 = ((temp_tab[i]&0x3f)<<2) ^ (temp_tab[i]>>6), 
			temp3 = ((temp_tab[i]&0x1f)<<3) ^ (temp_tab[i]>>5), 
			temp4 = ((temp_tab[i]&0x0f)<<4) ^ (temp_tab[i]>>4);
        s_box_tab[i] = temp_tab[i] ^ temp1 ^ temp2 ^ temp3 ^ temp4 ^ 0x63;
		if (s_box_tab[i] > ALen )
		{
			s_box_tab[i] ^= 0x11B;
		}
	}
}

//---------------------------------------------------------------------------------
//主函数入口
int _tmain(int argc, _TCHAR* argv[])
{
	int s_box_tab[ALen];
	int buf;
	s_box(s_box_tab);
	cout << "以下进行的是S-box的查询,请输入一个00到FF范围内的十六进制数,回车执行:" << endl;
	cin >> hex >> buf;
	if (buf<0 || buf >255)
	{
		cout << "error input,please input a number between 0 to 255" << endl; 
	}
	else 
	{
        cout << hex <<buf<<" 的S-box的转换数为 :" << hex << s_box_tab[buf] << endl;
	}
	system("PAUSE");
	return 0;
}//end of main()
//---------------------------------------------------------------------------------



⌨️ 快捷键说明

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