基于Feistel结构的加密

基于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;
}

实验截图:
实验截图

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值