基于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
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,以下是一个基于Feistel结构和LFSR的分组密码的示例代码,使用Python语言实现: ```python import random # 定义Feistel函数 def feistel_function(L, R, round_key): # 将L和R进行异或运算 xor_result = L ^ round_key # 对异或结果进行LFSR加密 lfsr_result = lfsr(xor_result) # 将加密结果与R进行异或运算 new_R = R ^ lfsr_result # 返回新的L和R return R, new_R # 定义LFSR函数 def lfsr(seed): # 定义LFSR的初始状态和反馈位 state = seed feedback_bit = 0b100000001 # 对LFSR进行16次迭代 for i in range(16): # 计算下一状态 feedback = state & feedback_bit bit = (feedback >> 8) ^ (feedback & 0b1111111) state = ((state << 1) & 0b111111111) | bit # 返回LFSR加密后的结果 return state # 定义Feistel加密函数 def feistel_encrypt(plaintext, key, rounds): # 将明文分成左右两部分 L = plaintext >> 8 R = plaintext & 0b11111111 # 对密钥进行LFSR加密 round_key = lfsr(key) # 进行Feistel加密数 for i in range(rounds): # 调用Feistel函数进行加密 L, R = feistel_function(L, R, round_key) # 对密钥进行LFSR加密 round_key = lfsr(round_key) # 将加密后的左右两部分进行拼接,并返回密文 return (L << 8) | R # 定义Feistel解密函数 def feistel_decrypt(ciphertext, key, rounds): # 将密文分成左右两部分 L = ciphertext >> 8 R = ciphertext & 0b11111111 # 对密钥进行LFSR加密 round_key = lfsr(key) # 进行Feistel解密的数 for i in range(rounds): # 调用Feistel函数进行解密 L, R = feistel_function(L, R, round_key) # 对密钥进行LFSR加密 round_key = lfsr(round_key) # 将解密后的左右两部分进行拼接,并返回明文 return (L << 8) | R # 测试代码 if __name__ == '__main__': # 随机生成一个明文和密钥 plaintext = random.randint(0, 0xffff) key = random.randint(0, 0xff) print("明文为:0x{:04x},密钥为:0x{:02x}".format(plaintext, key)) # 进行Feistel加密和解密 ciphertext = feistel_encrypt(plaintext, key, 8) decrypted_text = feistel_decrypt(ciphertext, key, 8) # 输出加密和解密后的结果 print("加密后的密文为:0x{:04x}".format(ciphertext)) print("解密后的明文为:0x{:04x}".format(decrypted_text)) # 检查解密后的明文是否和原明文相同 if decrypted_text == plaintext: print("解密成功!") else: print("解密失败!") ``` 在上述代码中,我们首先定义了Feistel函数和LFSR函数,然后在Feistel加密和解密函数中调用这些函数进行加密和解密。其中,Feistel加密和解密函数的参数分别为明文、密钥和数。在测试代码中,我们随机生成一个明文和密钥,并对明文进行Feistel加密和解密,最后检查解密后的明文是否和原明文相同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值