题目
Description
内容:按照教材例3.1实现SPN加解密函数。
要求:
(1)正确实现算法的加解密过程
(2)快速实现算法
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比特取反,解密后得到的明文。
sample input
1
3a94d63f 26b7
sample output
bcd6 070d
教材
思路
按照spn算法逐步实现,每四位放入一个int中,方便位运算。
使用数组存储代换。
初始代码
#include<cstdio>
using namespace std;
int x[4],key[8];
void readx()
{
register int yy=0;register char c=getchar();
while(1)
{
if(c>='0'&&c<='9')
{
x[yy++]=c-'0';c=getchar();
}else if(c>='a'&&c<='f')
{
x[yy++]=c-'a'+10;c=getchar();
}
else break;
}
}
void readkey()
{
register int yy=0;register char c=getchar();
while(1)
{
if(c>='0'&&c<='9')
{
key[yy++]=c-'0';c=getchar();
}else if(c>='a'&&c<='f')
{
key[yy++]=c-'a'+10;c=getchar();
}
else break;
}
}
int pais[16]={
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};
int paiss[16]={
14,3,4,8,1,12,10,15,7,13,9,6,11,2,0,5};
int n,chan[4];
int main()
{
scanf("%d\n",&n)