本文主要是介绍密码学课设 SPN增强 Hust,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目如图
个人见解
这题就如字面意思,就是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] = (
这篇关于密码学课设 SPN增强 Hust的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!