C语言实现移位密码

一.移位密码

   移位密码(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);

}

五.运行结果

if4C.jpg

六.补充

这是密码学中最简单的一种加密方法,但我们可以使其变得更复杂一些,比如自定义字母顺序表,密匙加强等。

猜你喜欢

转载自blog.csdn.net/weixin_51496226/article/details/131295956