基于Feistel结构的加密
问题描述
设计一个4轮Feistel结构的分组加密,分组的长度为8比特。半个分组为4个,即L和R长度各为4比特。
轮函数f=P(S ( E® + Ki)), i=1,2,3,4 , 这里 + 表示异或。
假设R=①②③④, E® = ②①②③④③;
S盒取DES的S盒,或者自己设计一个S盒,做一个表格即可,输入为6比特,输出为4比特,S(①②③④⑤⑥)=①②③④;P(①②③④)= ②④①③。
轮密钥编排从略,假定K1=111111,K2=111000,K3=000111,K4=000000
明文是自己的姓名。给出程序。给出密文。
C++语言实现
#include <iostream>
using namespace std;
typedef unsigned int Word;
typedef unsigned char Byte;
typedef unsigned long Dword;
#define L 0xF0
#define R 0X0F
#define Mask_r 0x21
#define Mask_c 0x1E
Byte S[4][16] = { {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}};
Byte e(Byte a)
{
a = a + ((a & 0x4) << 2);
a <<= 1;
a += (a & 0x4) >> 2;
return a;
}
Byte s(Byte a)
{
int r = ((a & 0x20) >> 4) + (a & 0x1);
int c = (a & Mask_c) >> 1;
return S[r][c];
}
Byte p(Byte a)
{
Byte p0 = a & 0x01;
Byte p1 = a & 0x02;
Byte p2 = a & 0x04;
Byte p3 = a & 0x08;
a = (p0 << 2) + (p2 << 1) + (p1 >> 1) + (p3 >> 2);
return a;
}
void f(Byte& w, Byte k)
{
w = e(w & R) ^ k;
w = s(w);
w = p(w);
}
void Feistel(Byte &w,Byte k)
{
Byte w_L = (w & L) >> 4;
Byte w_R = (w & R);
f(w_R,k);
w_R ^= w_L;
w_L = w & R;
w = (w_L << 4) + w_R;
}
void Encode(Byte *P,Byte *K)
{
for (int i = 0; P[i] != '\0'; i++)
{
for (int j = 0; j < 4; j++)
Feistel(P[i], K[i]);
P[i] = ((P[i] & R) << 4) + ((P[i] & L) >> 4);
}
}
int main()
{
Byte K[4] = {0x3F,0x38,0x07,0x00};
Byte P[7] = "朱靖宇";
cout << "明文为:" << P << endl;
cout << "轮密钥(0x)为:";
for (int i = 0; i < 4; i++)
printf("%02X ", K[i]);
cout << endl << endl << "开始加密" << endl;
Encode(P, K);
cout << "密文为: "<<endl;
for (int i = 0; P[i]!='\0'; i++)
printf("%02X", P[i]);
cout << endl << endl << "开始解密" << endl;
Encode(P, K);
cout << "明文为:" << endl;
/*for (int i = 0; P[i] != '\0'; i++)
printf("%02X", P[i]);*/
cout << P;
}
实验截图: