一.移位密码
移位密码(Caesar Cipher)也叫凯撒密码是一种简单的加密技术,它通过将明文中的每个字母按照指定的位数进行移位,从而生成密文。例如,在一个"左移3位"的移位密码中,文中的每个字母都向左移动3个位置,即A变成D,B变成E, 以此类推。移位密码可以被轻松破解,因此现在已经很少用于实际的加密通信中。
二.原理
2.1 名词解释
- 明文:发送发想要发送的信息;
- 密文:经过加密后的信息;
- 密匙:加密时移动的位数k。
(这里解释是我个人理解,非标准定义)
2.2 移位加密
具体来说,移位加密通常将明文中的每个字母替换为其在字母表中向后(或向前)移动固定数量的位置得到对应的密文字母。
步骤如下:
- 选择一个偏移量 k,确定每个字符需要向后移动还是向前移动。
- 对于明文中的每个字符,根据偏移将其向后或向前移动相应的位数,并将结果记录下来。
- 将所有移位后的字符连接起来,得到密文。
例如:这里假设明文是 word ,现在的密匙(偏移量)为3,那么我们加密后的密文就是 zrug 。(这里需要结合字母顺序表查看,顺序表由发送发与接收方约定定义,无第三方知道) 这里的偏移量表示字母移动的距离,当偏移量为正数时,字母向后移动;当偏移量为负数时,字母向前移动。
2.3 移位解密
具体来说,移位解密通常将密文中的每个字母替换为其在字母表中向后(或向前)移动固定数量的位置得到对应的明文字母。
步骤如下:
- 选择一个偏移量 k,确定每个字符需要向后移动还是向前移动。
- 对于密文中的每个字符,根据偏移将其向后或向前移动相应的位数,并将结果记录下来。
- 将所有移位后的字符连接起来,得到明文。
例如:如果现在的密文是 zrug ,密匙为3,那么明文就是 word 。
2.4 补充描述
- 现实生活中,密码是不存在空格的,因为英文大家都知道,传输一篇文章空格要占许多,对发送加密造成干扰,所以约定去掉字母。
- 补充本次实验所需的字母顺序表:
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | 25 |
这里我们为了方便理解,就用小写。
三.优缺点
优点:
- 简单易懂
- 易于实现和使用
缺点:
- 安全性较低,容易受到暴力破解攻击
- 容易受到频率分析攻击
缺陷原因分析:
- 只是将明文中的字符按照一定规则进行移动,不涉及其他复杂的操作;
- 没有对明文中不同字符出现的频率进行混淆处理。
四.C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Maxsize 50 //定义信息最大量
//加密函数
void jiami(char *&p,int n,int h)
{
printf("密文:");
for(int i=0;i<h-1;i++) //循环输出数组的每一个字符
{
printf("%c",(char) ((p[i] + 'a' - 97) + n - 97) % 26 + 97);
}
printf("\n");
}
//解密函数
void jiemi(char *&p)
{
for (int i = 1; i < 26; i++) {
printf("k为%d的明文:", i); //循环输出数组的每一个字符
for (int j = 0; j < strlen(p); j++) {
printf("%c", (char) (((p[j] + 'a' - 97) + 26 - i - 97) % 26 + 97));
//对应ASCLL码表,但是我们自定义了字母顺序表,需要转换范围
}
printf("\n");
}
}
int main()
{
char str1[Maxsize],str2[Maxsize];
char *p=str1,*q=str2;
int n;
printf("请输入明文:"); //加密测试
fgets(str1, Maxsize, stdin);
int len1=strlen(str1);
printf("请输入移位密匙:");
scanf("%d",&n);
jiami(p,n,len1);
printf("------------------");
printf("\n");
printf("请输入密文:"); //解密测试
printf("\n");
scanf("%s",str2);
jiemi(q);
}
五.运行结果
六.补充
这是密码学中最简单的一种加密方法,但我们可以使其变得更复杂一些,比如自定义字母顺序表,密匙加强等。