目录

  • 题目
  • 凯撒加密法
    • 代码实现
  • 维吉尼亚密码
  • 栅栏密码
  • 矩阵置换密码
  • 点击直接资料领取

题目

11.已知明文:MEET ME AFITER THE TOGO PARTY,分别用以下方法加密,写出加密后的密文。然后完成解密。
(1)Caesar加密,分别用k=3,k= 5加密;
(2) Vigenere密码,k = word:
(3)栅栏式密码;
(4)矩阵置换密码,矩阵3×8,分别用k= 12345678和k= 34127856。

凯撒加密法

凯撒加密法,或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

凯撒加密法通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。凯撒加密法还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,凯撒加密法非常容易被破解,而且在实际应用中也无法保证通信安全。
凯撒加密法的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA
MXPSV RYHU WKH ODCB GRJ
凯撒加密法的加密、解密方法还能够通过同余的数学方法进行计算。首先将字母用数字代替,A=0,B=1,…,Z=25。此时偏移量为n的加密方法即为:
En(x)=(x+n)mod26{\displaystyle E_{n}(x)=(x+n)\mod 26} 解密就是:
Dn(x)=(x−n)mod26{\displaystyle D_{n}(x)=(x-n)\mod 26}

代码实现

若代码粘贴时有问题可在下方领取

#include<stdio.h>
#include<stdlib.h>
#include<string.h>void Encry();//凯撒加密
void Decry();//解密 char Encry(char strl[],int key)//向右 移动key
{//printf("%d\n",&strl);for(int i=0;i<strlen(strl);i++){if(strl[i]>='A'&&strl[i]<='Z'){strl[i]=((strl[i]-'A')+key)%26+'A';}else if(strl[i]>='a'&&strl[i]<='z'){strl[i]=((strl[i]-'a')+key)%26+'a';}}return *strl;
}
void Decry(char *strl,int key)
{key=26-key;for(int i=0;i<strlen(strl);i++){if(strl[i]>='A'&&strl[i]<='Z'){strl[i]=((strl[i]-'A')+key)%26+'A';}else if(strl[i]>='a'&&strl[i]<='z'){strl[i]=((strl[i]-'a')+key)%26+'a';}}
}int main()
{int ans,key,flag=1; char strl[100];while(flag){printf("               **Caesar加密或解密菜单**\n\n\n");printf("--1·加密\n\n");printf("--2·解密\n");printf("请输入1或2选择功能:");scanf("%d",&ans);printf("请输入要加密或解密的字符串:");scanf(" %[^\n]",&strl);//gets(strl);printf("请输入加密或解密密钥:");scanf("%d",&key); switch(ans){case 1:{*strl=Encry(strl,key);printf("%s\n",&strl);}break;case 2:{Decry(strl,key);printf("%s\n",&strl);}break;default:break;}printf("是否结束(输入0为结束/1则继续):");scanf("%d",&flag); }return 0;
}

结果展示:

维吉尼亚密码

维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。


若代码粘贴时有问题可在下方领取

#include<stdio.h>
#include<stdlib.h>
#include<string.h>void Encry();//维吉尼亚加密
void Decry();//解密
void GetKey();void Encry(char *PTstr,char *Kstr)
{for(int i=0;i<strlen(PTstr);i++){if(PTstr[i]>='A'&&PTstr[i]<='Z'){PTstr[i]=(PTstr[i]+Kstr[i])%26+'A';}
//      else if(PTstr[i]>='a'&&PTstr[i]<='z')
//      {//          PTstr[i]=(PTstr[i]+Kstr[i])%26+'a';
//      }}
}void Decry(char *strl,char *Kstr)
{for(int i=0;i<strlen(strl);i++){if(strl[i]>='A'&&strl[i]<='Z'){strl[i]=(strl[i]-Kstr[i])%26+'A';}
//      else if(strl[i]>='a'&&strl[i]<='z')
//      {//          strl[i]=((strl[i]-Kstr[i])+26)%26+'a';
//      }}
}//MEET ME AFITER THE TOGO PARTY
void GetKey(char *key,int PTlen)
{int len=strlen(key);for(int i=0;i<PTlen;i++){if(key[i]>='a'&&i<len)//将小写转为大写 {key[i]=key[i]-32;}if(i>=len){key[i]=key[i-len];}}
}int main()
{int ans,flag=1; char plaintext[100];char key[50];while(flag){printf("               **Vigenere加密或解密菜单**\n\n\n");printf("--1·加密\n\n");printf("--2·解密\n");printf("请输入1或2选择功能:");scanf("%d",&ans);printf("请输入要加密或解密的字符串:");scanf("%[^\n]",&plaintext);//gets(strl);printf("请输入加密或解密密钥关键字:");scanf("%[^\n]",&key);switch(ans){case 1:{GetKey(key,strlen(plaintext));Encry(plaintext,key);printf("%s\n",&plaintext);}break;case 2:{GetKey(key,strlen(plaintext));Decry(plaintext,key);printf("%s\n",&plaintext);}break;default:break;}printf("是否结束(输入0为结束/1则继续):");scanf("%d",&flag); }return 0;
}

栅栏密码

①把将要传递的信息中的字母交替排成上下两行。
②再将下面一行字母排在上面一行的后边,从而形成一段密码。
③例如:
明文:THE LONGEST DAY MUST HAVE AN END
加密:
1、把将要传递的信息中的字母交替排成上下两行。
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
2、 密文:
将下面一行字母排在上面一行的后边。
TEOGSDYUTAENN HLNETAMSHVAED
解密:
先将密文分为两行
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
再按上下上下的顺序组合成一句话
明文:THE LONGEST DAY MUST HAVE AN END

代码
若代码粘贴时有问题可在下方领取

#include<stdio.h>
#include<stdlib.h>
#include<string.h>void Encry();//栅栏密码加密
void Decry();//解密 void Encry(char *PTstr)
{int len=strlen(PTstr),flag=0,count=0;char pre[(len+1)/2];//无论奇偶都加一,主要练习指针其实完全没必要建立pre和rear可以直接在PTstr操作 char rear[(len+1)/2];char *p=pre,*r=rear; for(int i=0;i<len;i++){if(PTstr[i]!=' '){if(flag==0) {*p=PTstr[i];p=p+1;flag=1;}else{*r=PTstr[i];r=r+1;flag=0;}}else{count++;}}*p='\0';*r='\0';printf("加密后得到:");printf("%s",pre);printf("%s\n",rear);
}
//MEET ME AFITER THE TOGO PARTY
void Decry(char *strl)
{int len=strlen(strl),flag=0;char *p=strl;char *r=&strl[((len+1)/2)];printf("解密后得到:");for(int i=0;i<len;i++){if(flag==0){printf("%c",*p);p++;flag=1;}else {printf("%c",*r);r++;flag=0;}}
}int main()
{int ans,flag=1; char plaintext[100];char key[50];while(flag){printf("               **栅栏密码加密或解密菜单**\n\n\n");printf("--1·加密\n\n");printf("--2·解密\n");printf("请输入1或2选择功能:");scanf("%d",&ans);printf("请输入要加密或解密的字符串:");scanf(" %[^\n]",&plaintext);//gets(strl);switch(ans){case 1:{Encry(plaintext);}break;case 2:{Decry(plaintext);}break;default:break;}printf("\n是否结束(输入0为结束/1则继续):");scanf("%d",&flag); }return 0;
}

矩阵置换密码

置换也是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。

如下:

代码:此次解法是适用于3*8矩阵其实稍加变换把里面的矩阵行列变为可出入的变量即可变成万能解:
若代码粘贴时有问题可在下方领取

#include<stdio.h>
#include<stdlib.h>
#include<string.h>void Encry();//矩阵置换加密
void Decry();//解密 //此次解法比较低级只针对3*8矩阵
void Encry(char *PTstr,char *k)
{char matrix[3][8],*p;int row=0,col=0,flag=0;p=PTstr;while(flag<strlen(PTstr))//构建矩阵 {if(*p!=' '){matrix[row][col]=*p;p++;col++;}else{p++;}if(col==8){col=0;row++;}flag++;}printf("矩阵置换密码后得到:");char newMatrix[3][8];for(int i=0;i<8;i++){for(int j=0;j<3;j++){int n=*k-48-1;//从零开始需要在减一 newMatrix[j][i]=matrix[j][n];}k++;}for(int i=0;i<3;i++){for(int j=0;j<8;j++){printf("%c",newMatrix[i][j]);}}
}
//MEET ME AFITER THE TOGO PARTY
void Decry(char *strl,char *k)
{char matrix[3][8],p;int row=0,col=0,flag=0;p=strl;while(flag<strlen(strl))//构建矩阵 {if(*p!=' '){matrix[row][col]=*p;p++;col++;}else{p;}if(col==8){col=0;row++;}flag++;}printf("解密后得到:");char newMatrix[3][8];for(int i=0;i<8;i++){for(int j=0;j<3;j++){int n=*k-48-1;//从零开始需要在减一 newMatrix[j][n]=matrix[j][i];}k++;}for(int i=0;i<3;i++){for(int j=0;j<8;j++){printf("%c",newMatrix[i][j]);}}
}int main()
{int ans,flag=1; char plaintext[100];char key[50];while(flag){printf("               **栅栏密码加密或解密菜单**\n\n\n");printf("--1·加密\n\n");printf("--2·解密\n");printf("请输入1或2选择功能:");scanf("%d",&ans);printf("请输入要加密或解密的字符串:");scanf(" %[^\n]",&plaintext);printf("请输入Key的值:");scanf(" %[^\n]",&key);//gets(strl);switch(ans){case 1:{Encry(plaintext,key);}break;case 2:{Decry(plaintext,key);}break;default:break;}printf("\n是否结束(输入0为结束/1则继续):");scanf("%d",&flag); }return 0;
}

点击直接资料领取

在资料回复密码学即可获取源码和截图

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

详解密码学中几种常见密码加密与解密相关推荐

  1. 详解SQL中几种常用的表连接方式!

    导读:数据库性能优化最主要的就是SQL优化,SQL优化的关键离不开三点:表的连接方式.访问路径和执行顺序,本文重点介绍几种常见的连接方式. 多表关联查询,查询优化器的执行步骤具体如下. 1)访问路径: ...

  2. 详解 Java 中 4 种 I/O 模型

    同步.异步.阻塞.非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作.而在文件读取这件事儿上,可以有多种方式. 本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几 ...

  3. 阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择

    简介:Kubernetes下5场场景应用发布方式的选择,每种发布模式适合什么样的场景,以及如何在阿里云云效上高效落地. 作者:郑云龙,阿里云云效技术专家 Kubernetes面向通用场景提供了非常灵活 ...

  4. python整数类型没有取值范围限制_详解Python中6种数据类型

    Python中数据类型主要有六种:数字类型,字符串类型,元组类型,列表类型,文件类型和字典类型,我们今天先介绍前四种类型. 假如在Python程序中,出现了"010",那么这个&q ...

  5. 详解Yarn中三种资源调度器(FIFO Scheduler、Capacity Scheduler、Fair Scheduler)和配置自定义队列实现任务提交不同队列

    前言 在前面 Yarn的基本架构和作业提交全流程 一文中提到,当ResourceManager收到客户端Client的请求之后会将该作业job添加到(默认的)容量调度器中,然后再由某一个空闲的Node ...

  6. App渗透中常见的加密与解密

    App渗透中常见的加密与解密 2018年10月17日 移动安全 54632 views 前言:本文主要介绍了目前App数据传输过程中几种常见的加密方式,以及一些常规的解密手段,并不涵盖并应对所有情况, ...

  7. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  8. linux用户密码管理,Linux_详解Linux中的用户密码管理命令passwd和change,passwd 修改用户密码参数 nbsp - phpStudy...

    详解Linux中的用户密码管理命令passwd和change passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用 ...

  9. html里position属性,科技常识:详解html中 position属性用法(四种)

    今天小编跟大家讲解下有关详解html中 position属性用法(四种) ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关详解html中 position属性用法(四种) 的相关资料,希望小 ...

最新文章

  1. 蓝桥杯 【基础练习】 十六进制转八进制
  2. linux常用命令-date-clock-hwclock-type-whois--help-man-info-cal
  3. TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发
  4. 行波和驻波动画演示gif_新技能get√ | 语文课上的笔顺动画可以这么做
  5. zen cart如何给新产品、特价、推荐产品页面加标题、关键字、描述
  6. python中if else语句_python 中if else 语句的作用及示例代码
  7. LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)
  8. Capte4 布朗运动和伊藤公式
  9. win7开机突然变得很慢_Win7电脑反应变慢怎么办?
  10. 使用字体编辑软件修改字体
  11. 基于HTML5的在线绘图工具,基于HTML5 Canvas和jQuery 的绘图工具的实现
  12. Python总结-学习方向和方法
  13. android设备连接win10,win10手机连接Android设备、iphone 操作方法
  14. Errors were encountered while preparing your device for development. Please check the Devices and Si
  15. 项目经理如何做好项目管理PMP - 持续更新
  16. 用wireshark捕捉查看登录时账号密码的传输方式
  17. C语言网 1881: 蓝桥杯2017年第八届真题-Excel地址(python)
  18. 流媒体之色彩转换——RGB(X)与YUV之间转换
  19. 域名抢注自动提交程序详解
  20. tomcat启动一闪而逝

热门文章

  1. 谷歌浏览器切换页面或者隐藏页面造成定时器延缓或者停止的问题。
  2. 微信小程序云开发之数据分页云函数
  3. 【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS开发板】初探
  4. Docker在自动化测试中的实践应用,看了必有提升
  5. Facebook如何安全度过新账号阶段不被封号
  6. 新版 Win10 来了!网友:要被丑哭了。。。
  7. 百度智能云实战——静态文件CDN加速
  8. 查询网站收录的方式?怎样查询网站收录情况?
  9. 微信商家收款码怎么申请,3分钟快速开通低费率商户方法
  10. 怎样才能实现表格背景图片拉伸