题目要求
Input
第一行,一个正整数n,表示n组数据。
接下来n行,每行包含两个用空格分开的16进制字符串。第一个字符串长度为8,表示32比特密钥key,第二个字符串长度为4,表示16比特明文。
对1<=k<=6,第k个数据点点满足n = 10^k。
对k=7,n = 4*10^6。
TIPS: 需要快速读入
Output
共n行,每行包含两个用空格分开的16进制字符串。第一个字符串表示对应行的明文加密后的密文,第二个字符串表示将密文最后1比特取反,解密后得到的明文。
未优化的代码
目前只能跑过k=5,再高就跑的太慢了,还是太菜了。
#include <string>
#include <iostream>
#include <math.h>
#include <vector>
#include <cstring>
#include<algorithm>
#pragma warning(disable : 4996)
static int SBox[16] = {
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};
static int PBox[16] = {
1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16};
static int SBox_inverse[16] = {
14,3,4,8,1,12,10,15,7,13,9,6,11,2,0,5};
static int PBox_inverse[16] = {
1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16};
using namespace std;
int HexToDec(string str) //十六进制转十进制
{
if (str.empty())
return 1; //字符串为空
if (str.length() > 8)
return -1; //超出范围
int n = 0;
char* pc = const_cast<char*>(str.c_str());
int cpyCount = str.length();
int mid;
for (int i = 0; i < cpyCount; i++)
{
if (*pc >= '0' && *pc <= '9')
mid = *pc - '0';
else if (*pc >= 'A' && *pc <= 'F')
mid = *pc - 'A' + 10;
else if (*pc >= 'a' && *pc <= 'f')
mid = *pc - 'a' + 10;
else
return -1; //含有非法字符
mid *= pow(16,(cpyCount - 1 - i));
n += mid;
pc++;
}
return n;
}
string DecToHex(int dec) //十进制转十六进制
{
char hex[16] = {
'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
string str = "";
for (int i = 4; i > 0; i--) //将十六进制存为字符数组
{
int point = (int)(dec / pow(16, i - 1));
str = str + hex[point];
dec = dec - point * pow(16, i - 1);
}
return str;
}
string DecToBin(int dec) //十进制转二进制
{
string s;
for (int a = dec, i=0; a || i<16; a = a / 2, i++)
s = s + ((a % 2) ? '1' : '0'); //不断进行相除
reverse(s.begin(), s.end()); //倒置字符串
return s;
}
int BinToDec(string str) //二进制转十进制
{
int n = 0;
char* pc = const_cast<char*>(str.c_str());
int cpyCount = str.length();
int mid;
for (int i = 0; i < cpyCount; i++)
{
if (*pc == '1')
mid = *pc - '0';
else
mid = 0;
mid *= pow(2, (cpyCount - 1 - i));
n += mid;
pc++;
}
return n;
}
string S_Change(string str) //S盒置换
{
auto length = str.length();
string back = "";
for (int i = 0; i < length; i++)
{
string tool = str.