古典密码实验
设计并实现“恺撒密码”。
N=3、7时,加密并恢复一段文字,例如“Peace and Love”。
1.(不)区分大小写,但能识别空格、标点;
2.不调用现有库、函数,自己编程实现。
前言
例如:随着人工智能的不断发展,网络安全这门技术也越来越重要,很多人都开启了密码学学习以及网络安全学习,本文就介绍了古典密码之一的凯撒密码的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、恺撒密码是什么?
恺撒密码是古罗马时代经常使用的一种经典加密算法,伴随着恺撒的南征北战而流传于世。恺撒密码的基本原理是将明文字符串中的每一位字母往后(或往前)移N位,N即是对明文进行加密的密钥;移位之后的结果是一串无明显语义信息的字符串,即密文;解密过程是将密文中的每一位字母往前(或往后)移N位。
最简单的明文是一串英文字母,不区分大小写、无空格和其它标点符号。加密这种明文的第一步是将字母与数字一一对应,例如a对应数字0、b对应数字1、…、z对应数字25;然后,将明文中每一位字母所对应的数字增加(或减少)N后取模,例如,假设N=3,对明文中字母b的加密结果是:1+3 mod 26 =4,对字母z的加密结果是:25+3 mod 26=2。
稍复杂一点的明文除了包括英文字线,可能还包括空格、标点,简单的处理方式是将空格、标点作为特殊明文,例如,设标点符号对应数字26,逗号对应数字27,句号对应数字28;如果作了上述设定,则模数26也要相应增加。更通用的方法是使用ASCII对照表,可将所有的大小写字母、各种标点、符号都转换成相应的数字。
二、简单英文字母凯撒密码
1.引入库
代码如下(示例):
#include <stdio.h>
2.读入数据
代码如下(示例):
void menu(int a)
{
int i;
char c[26], ch;
int n;
if (a == 1)
{
printf("\n输入n值:\n");
scanf("%d", &n);
ch = getchar();
printf("\n输入原始字符串:");
gets(c);
fun1(c, n);
printf("\n转换后:");
puts(c);
printf("\n");
}
else if (a == 2)
{
printf("\n输入n值:\n");
scanf("%d", &n);
ch = getchar();
printf("\n输入需解密的字符串:");
gets(c);
fun2(c, n);
printf("\n解密后:");
puts(c);
printf("\n");
}
else
printf("输入有误");
}
int main()
{
int n;
printf("\n加密输入1,解密输入2\n");
scanf("%d", &n);
if (n != (int)n){
printf("输入错误");}
else
menu(n);
return 0;
}
3.加密
代码如下(示例):
void fun(char str[], int n) //加密
{
//使用两个数组分别存放大小写字符
char min[26]={'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'};
char max[26]={'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'};
int a[26];
int i,j,k,b,c;
i = 0;
j = 0;
for(i = 0; str[i] != '\0'; i++){//小写字母
if('a'<=str[i] && str[i]<='z'){
for(j = 0;min[j];j++){
if(min[j] == str[i]){//判断输入字段的数字位置
k = j;
break;
}
}
b = k + n;//将往后移动n位对应数字位置
c = b % 26;
str[i] = min[c];//得到新的字符串
}
else if('A'<=str[i] && str[i]<='Z'){//大写字母
for(j = 0;max[j];j++){
if(max[j] == str[i]){//判断输入字段的数字位置
k = j;
break;
}
}
b = k + n;//将往后移动n位对应数字位置
c = b % 26;
str[i] = max[c];//得到新的字符串
}
else//若输入字符不符
printf("%c input is incorrect\n", str[i]);
}*/
int i, j, b, c;
for (i = 0; str[i] != '\0'; i++)
{
if ((int)str[i] >= 32 && (int)str[i] <= 126)
{
for (j = 32; j <= 126; j++)
{
if (j == (int)str[i])
{ //判断输入字段的数字位置
break;
}
}
b = j + n; //将往后移动n位对应数字位置
c = b % 94;
if(c<32){
c=c+32;
}
str[i] = (char)c; //得到新的字符串
}
else //若输入字符不符
printf("%c input is incorrect\n", str[i]);
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了简单凯撒密码。有什么好的建议各位可以多留言鸭。