0
点赞
收藏
分享

微信扫一扫

设计并实现“恺撒密码”--简单版

古典密码实验

设计并实现“恺撒密码”。


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]);
  }
}


总结

以上就是今天要讲的内容,本文仅仅简单介绍了简单凯撒密码。有什么好的建议各位可以多留言鸭。

举报

相关推荐

0 条评论