【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;
}

相关推荐

  1. C语言对称密码——栅栏加密解密

    2024-03-21 23:46:03       40 阅读
  2. C语言】单表交换密码加密解密

    2024-03-21 23:46:03       34 阅读
  3. C#数据库密码加密保存登录验证方法

    2024-03-21 23:46:03       30 阅读
  4. C#加密解密、哈希

    2024-03-21 23:46:03       37 阅读
  5. c# 文本加密解密

    2024-03-21 23:46:03       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 23:46:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 23:46:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 23:46:03       87 阅读
  4. Python语言-面向对象

    2024-03-21 23:46:03       96 阅读

热门阅读

  1. 什么是虚拟dom

    2024-03-21 23:46:03       41 阅读
  2. Linux之shell文本搜索工具grep

    2024-03-21 23:46:03       41 阅读
  3. android VPN 数据包解析

    2024-03-21 23:46:03       47 阅读
  4. Python从入门到精通秘籍十一

    2024-03-21 23:46:03       43 阅读
  5. ARM day5

    2024-03-21 23:46:03       42 阅读
  6. Redis Pub/Sub: 实时消息传递的完美解决方案

    2024-03-21 23:46:03       45 阅读
  7. Python和FastAPI语义分析和文本图像

    2024-03-21 23:46:03       43 阅读
  8. css的scss

    2024-03-21 23:46:03       50 阅读
  9. 蓝桥杯2023年第十四届省赛真题-阶乘求和

    2024-03-21 23:46:03       65 阅读