简介

移位加密是一种古典的替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如:当偏移量是3的时候,所有的字母A将被替换成D,B替换成E,此时的加密方式称为凯撒密码。

  • 此程序进行动态录入移位数,称之为密钥;并且仅支持输入大小写字母。

思路:

  • 利用取余的方式实现移位

代码实现

加密过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
/* 加密 */
int main()
{
int key = 0;
char word_1[50] = "\0"; //加密前
char word_2[50] = "\0"; //加密后
int i = 0;
printf("输入明文:");
scanf("%s", word_1);
printf("输入密钥:");
scanf("%d", &key);
for(i = 0; word_1[i] != '\0'; i++)
{
if(word_1[i] >= 'A' && word_1[i] <= 'Z')
word_2[i] = (word_1[i] - 'A' + key) % 26 + 'A'; //进行移位加密
else if(word_1[i] >= 'a' && word_1[i] <= 'z')
word_2[i] = (word_1[i] - 'a' + key) % 26 + 'a';
}
printf("加密后密文是:%s", word_2);

return 0;
}

明文输入HelloWorld,密钥输入3,加密后的结果:
在这里插入图片描述

解密过程

移位加密的解密过程有两种:
1、当知道密文和密钥时,利用和加密同样的方法,进行反向移位替换,即可得出明文;
2、当只知道密文,不知道密钥时,因为移位加密是根据26字母表来进行移位加密的,当移位为0和26时,结果一致,所以总共有25种情况。可以通过穷举的方法测试每一种情况,来猜出明文。

第一种:知道密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
/* 解密 */
int main()
{
int key = 0;
char word_1[50] = "\0"; //解密前
char word_2[50] = "\0"; //解密后
int i = 0;
printf("输入密文:");
scanf("%s", word_1);
printf("输入密钥:");
scanf("%d", &key);
for(i = 0; word_1[i] != '\0'; i++)
{
if(word_1[i] >= 'A' && word_1[i] <= 'Z')
word_2[i] = (word_1[i] - 'A' - key) % 26 + 'A'; //进行移位解密
else if(word_1[i] >= 'a' && word_1[i] <= 'z')
word_2[i] = (word_1[i] - 'a' - key) % 26 + 'a';
}
printf("解密后明文是:%s", word_2);
return 0;
}

结果:
在这里插入图片描述

第二种:不知道密钥,穷举法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
/* 穷举法解密 */
int main()
{
char word_1[50] = "\0"; //解密前
char word_2[50] = "\0"; //解密后
int i = 0;
int j = 0;
printf("输入密文:");
scanf("%s", word_1);
for(i = 0; i < 26; i++)
{
for(j = 0; word_1[j] != '\0'; j++)
{
if(word_1[j] >= 'A' && word_1[j] <= 'Z')
word_2[j] = (word_1[j] - 'A' + i) % 26 + 'A'; //将密钥key换成i进行尝试
else if(word_1[j] >= 'a' && word_1[j] <= 'z')
word_2[j] = (word_1[j] - 'a' + i) % 26 + 'a';
}
printf("第%d次尝试:%s\n", i + 1, word_2);
}
return 0;
}

结果:
在这里插入图片描述

经过穷举,也测出了明文。