【C语言】对称密码——栅栏的加密和解密

 栅栏密码的原理:

栅栏层数n

①把将要传递的信息中的字母交替排成上下n行。

②再将下面每一行字母排依次在上面一行的后边,从而形成一段密码。

③例如:栅栏层数为2

明文:THE LONGEST DAY MUST HAVE AN END

加密:

1、把将要传递的信息中的字母交替排成上下两行。

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

2、 密文:

将下面一行字母排在上面一行的后边。

TEOGSDYUTAENN HLNETAMSHVAED

解密:

先将密文分为两行

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

再按上下上下的顺序组合成一句话 

明文:THE LONGEST DAY MUST HAVE AN END 

代码实现 

根据上面的原理,显然我们可以用二维数组来解决加密解密的问题。 

#include <stdio.h>
#include <string.h>

// 函数:栅栏加密
void railFenceEncrypt(char* plainText, int rail, int len) {
    // 创建一个二维数组来存储栅栏
    char fence[rail][len];
    //创建一个字符串来存密文
    char cipher[rail * len];
    // 将明文字符依次填入栅栏中
    for (int i = 0; i < rail; i++) {
        for (int j = 0; j < len; j++) {
            fence[i][j] = plainText[i + j * rail];
        }
    }
    //创建index存密文索引
    int index = 0;
    // 输出密文
    printf("密文:");
    for (int i = 0; i < rail; i++) {
        for (int j = 0; j < len; j++) {
            if (fence[i][j] != '\0')
                cipher[index] = fence[i][j];
            index++;
        }
    }
    printf("%s", cipher);
    printf("\n");
}

// 函数:栅栏解密
void railFenceDecrypt(char* cipherText, int rail, int len) {
    // 创建一个二维数组来存储栅栏
    char fence[rail][len];

    char plain[rail * len];

    for (int i = 0; i < rail; i++) {
        for (int j = 0; j < len; j++) {
            fence[i][j] = cipherText[i * len + j];
        }
    }

    int index = 0;
    printf("明文:");
    for (int i = 0; i < len * rail; i++) {
        for (int j = 0; j < rail; j++) {
            if (fence[j][i] != '\0' && index < len * rail)
                plain[index] = fence[j][i];
            index++;
        }
    }
    printf("%s", plain);
}

//除去字符串中的空格
void removeSpaces(char* str) {
    int i, j = 0;
    int len = strlen(str);

    for (i = 0; i < len; i++) {
        if (str[i] != ' ') {
            str[j] = str[i];
            j++;
        }
    }
    str[j] = '\0';
}
int main() {
    printf("请输入明文:");
    char plainText[100];
    //接收带空格的字符串
    fgets(plainText, 100, stdin);
    removeSpaces(plainText);
    int rail = 0;
    int len = strlen(plainText);

    printf("明文:%s\n", plainText);
    printf("请输入栅栏数:");
    scanf("%d", &rail);
    railFenceEncrypt(plainText, rail, len / rail);

    //解密
    printf("请输入密文:");
    char cipherText[1000];
    scanf("%s", cipherText);
    len = strlen(cipherText);

    printf("密文:%s\n", cipherText);
    printf("请输入栅栏数:");
    scanf("%d", &rail);
    railFenceDecrypt(cipherText, rail, len / rail);

    return 0;
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DES是一种对称分组加密算法,其加密解密过程使用相同的密钥。下面是用C语言实现DES对称分组加密/解密算法的步骤: 1. 定义密钥 DES算法使用56位的密钥,但是由于每个字节的最高位都是奇偶校验位,因此实际上只有48位是用于加密的。在C语言中,可以使用unsigned char类型的数组来表示密钥,例如: ```c unsigned char key[8] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; ``` 2. 初始置换 DES算法将64位的明文分成左右两个32位的部分,然后进行初始置换,将明文的每一位按照一定的规律重新排列。在C语言中,可以使用unsigned char类型的数组来表示明文,例如: ```c unsigned char plaintext[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; ``` 3. 迭代加密/解密 DES算法将明文分成左右两个32位的部分,然后进行16轮的迭代加密/解密。在每一轮中,右半部分的32位和一个48位的子密钥进行异或运算,得到一个32位的结果,然后将左右两部分交换。在C语言中,可以使用unsigned int类型的变量来表示32位的数据,例如: ```c unsigned int left = 0x01234567; unsigned int right = 0x89ABCDEF; ``` 4. 逆置换 DES算法将最后一轮迭代加密/解密得到的左右两部分按照一定的规律进行逆置换,得到最终的密文。在C语言中,可以使用unsigned char类型的数组来表示密文,例如: ```c unsigned char ciphertext[8] = {0x85, 0xE8, 0x4D, 0x4E, 0x67, 0x6F, 0x04, 0x3C}; ``` 以上是DES算法的基本流程,具体实现需要涉及到一些细节问题,例如如何生成子密钥、如何进行异或运算、如何进行置换等等。如果需要实现DES算法,建议参考DES算法的标准实现,例如OpenSSL库中的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱因斯坦乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值