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