题目如图
个人见解
这题就如字面意思,就是SPN加密的加强版。加强的方式无非就是改变密钥长度,改变S盒的加密方式,增加加密轮数等等…
因为这次加密的明文很长,所以我一次加密64位,S盒和P盒的内容也要随之改变了。
我的主要改变方法就是S盒的加密方法改变,由书上的s[16]改成了s[16][16]置换,其实还可以改进一下,就是让每一轮加密的S[16][16]内容都不相同,但是已经可以过系统的检测了就懒得再改了。
P盒由16长度变为了32长度。
这题有一个坑就是他给的TIPS,不能用ECB工作模式,所以要用CBC工作模式加密。
ECB:
CBC:
说白了就是,CBC每次明文加密之前,都要和上一组加密完成后的密文异或一下再继续假面,而ECB没有这个步骤。而第一组加密的明文没有上一组密文可以异或,所以需要我们随机生成一个y0去进行这个操作。
代码 C语言
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define true 1
#define false 0
#define nr 8
#define tu (1<<21)
unsigned long long Key[9];
/*与初始spn相比,增加了轮数,增加了分组长度,增加了秘钥长度,使用了AES的S盒子*/
/*分组长度为64*/
unsigned short S[16][16] = {
};//S盒子内容就自己填吧,反正随机的
unsigned short P[32] = {
};//P盒子内容就自己填吧,反正随机的
unsigned long long S_Box(unsigned long long In)
{
unsigned long long Out = 0;
unsigned long long M[16];
M[0] = (In & 0xF000000000000000) >> 60;
M[1] = (In & 0x0F00000000000000) >> 56;
M[2] = (In & 0x00F0000000000000) >> 52;
M[3] = (In & 0x000F000000000000) >> 48;
M[4] = (In & 0x0000F00000000000) >> 44;
M[5] = (In & 0x00000F0000000000) >> 40;
M[6] = (In & 0x000000F000000000) >> 36;
M[