密码学之凯撒密码(C语言)
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>#define N 1000//加密
void encrypt();//解密
void decrypt();//穷举解密
void decryptAll();/** main()函数负责生成选择菜单并供用户选择*/
int main() {int select;while (1) { //循环控制加解密完成后再次进入模式选择界面printf("----------**模式选择**----------\n");printf("1:加密\n");printf("2:解密\n");printf("3:暴力破解\n");printf("输入其他:退出\n");printf("--------------***---------------\n");printf("输入序号:");scanf("%d", &select);if (select == 1)encrypt(); //选1加密else if (select == 2)decrypt(); //选2解密else if (select == 3)decryptAll(); //选3穷举所有明文else //其他情况直接退出return 0;}
}/** 输入并判断密钥格式,符合条件就返回密钥* key要在1~26之间*/
int key() {char k[N]; //将key定义成字符串而不是int,避免输入字符时报错printf("输入密钥(1~26):");gets(k); //获取字符串while (1) {if (atoi(k) > 0 && atoi(k) <= 26) //atoi()是将字符串转为数字break;printf("格式错误,输入密钥(1~26):");gets(k);}return atoi(k);
}
/** 解密时的字母转换* 参数为:密文,明文,密钥* 作用是根据密钥将密文转换为明文*/
void change(char plaintext[], char ciphertext[], int k) {for (int i = 0; i < strlen(ciphertext); i++) {if (islower(ciphertext[i]))plaintext[i] =//(ciphertext[i] - 'a' - k) < 0时,则自身+26,保证a往前移又回到了z((ciphertext[i] - 'a' - k) > 0 ? (ciphertext[i] - 'a' - k) : ((ciphertext[i] - 'a' - k) + 26)) %26 + 'a';else if (isupper(ciphertext[i]))plaintext[i] =//解释同上((ciphertext[i] - 'A' - k) > 0 ? (ciphertext[i] - 'A' - k) : ((ciphertext[i] - 'A' - k) + 26)) %26 + 'A';elseplaintext[i] = ciphertext[i]; //遇到非字母则不转换}
}/** 加密操作* @返回值:密文* @参数:明文、密钥*/
void encrypt() {char plaintext[N] = {}, ciphertext[N] = {};int k;getchar();//清除缓存中遗留的回车printf("输入明文:");gets(plaintext);k = key();for (int i = 0; i < strlen(plaintext); i++) {if (islower(plaintext[i])) //如果是小写ciphertext[i] = (plaintext[i] - 'a' + k) % 26 + 'a';else if (isupper(plaintext[i])) //如果是大写ciphertext[i] = (plaintext[i] - 'A' + k) % 26 + 'A';elseciphertext[i] = plaintext[i]; //遇到非字母则不转换}printf("密文是:");puts(ciphertext);
}/** 解密操作* @返回值:明文* @参数:密文、密钥*/
void decrypt() {char plaintext[N] = {}, ciphertext[N] = {};int k;getchar();//清除缓存printf("输入密文:");gets(ciphertext);k = key(); //调用key()函数输入并检验密钥格式change(plaintext, ciphertext, k);//调用change()函数处理密文转换成明文printf("明文是:");puts(plaintext);
}/** 穷举* @返回值:密文* @参数:明文*/
void decryptAll() {char plaintext[N] = {}, ciphertext[N] = {};getchar();//清除缓存printf("输入密文:");gets(ciphertext);for (int k = 1; k <= 26; ++k) { //密钥为1~26时,穷举出每个密钥对应的明文change(plaintext, ciphertext, k); //调用change()函数处理密文转换成明文printf("当key = %d时,明文是:", k);puts(plaintext);}
}
密码学之凯撒密码(C语言)相关推荐
- 凯撒密码C语言去掉空格字符,凯撒密码C语言实现
<凯撒密码C语言实现>由会员分享,可在线阅读,更多相关<凯撒密码C语言实现(8页珍藏版)>请在人人文库网上搜索. 1.凯撒密码是一种非常古老的加密方法, 相传当年凯撒大地行军打 ...
- 凯撒密码c语言小写字母,凯撒密码c(c语言编程凯撒密码)
凯撒密码c(c语言编程凯撒密码) 2020-05-15 13:09:51 共10个回答 #include#includeintmain(){charsave[10][30];inta,b,i,j;sc ...
- 凯撒密码C语言去掉空格字符,凯撒密码的问题C语言
满意答案 xlaijing19 推荐于 2016.04.01 采纳率:43% 等级:12 已帮助:6257人 最低0.27元开通文库会员,查看完整内容> 原发布者:耿万德 凯撒密码是一种非 ...
- 凯撒密码C语言用ASCII码,凯撒密码帮助ASCII循环
我想创建一个凯撒密码,我有输入作为程序中的硬代码.当我运行该程序时,它的工作原理是,但应该是"Y"的所有内容都是"?".我无法弄清楚如何循环ASCII,所以当它 ...
- 凯撒密码c++语言程序,C++中的凯撒密码程序
我想用C++编写凯撒密码程序.我使用了四个函数,一个用于选择Shift键,两个用于加密和解密,最后一个用于实现凯撒密码,使用输入文件读取文本并将加密或解密文本输出到输出文件中.我试图运行代码,它正在崩 ...
- 凯撒密码c++语言程序,凯撒密码(加密与解密)
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. /******************************************** ...
- 凯撒密码c语言公式原理,凯撒密码 C语言实现.pdf
凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全.他的原理很简单, 说到底就是字母于字母之间的替换.下面 ...
- 洛谷小书童——凯撒密码——c语言
题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密码是由 ...
- 2021.12.9洛谷小书童——凯撒密码——c语言
题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密码是由 ...
最新文章
- android sdk软件开发套件,ANDROIDSDK-SITARA
- 单层神经网络-Logistics回归中误差曲线
- 调研Redis高可用两种方案
- sdn体系的三个平面_十张图看懂SDN与NFV的区别与联系?
- android 反射调用方法可不可以重载,使用Java进行反射投射和重载方法调度
- halcon圆环完整度检测
- Android MotionEvent中getX()、getRawX()和getTop()的区别
- restfull加签_SpringBoot RestFull API签名
- 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
- 【opencv学习】【图像金字塔】
- python三种基本数据类型_Python的三种基本数据类型
- Rust 多久更新一次?
- 总结几种简单实用的数据恢复技巧
- RxJava Subject
- 【DT调研】关于BIM + GIS的相关知识了解
- 电路交换,报文交换和分组交换的原理、区别、优缺点
- 图解CNN:通过100张图一步步理解CNN
- python:水果与设计模式-原型模式
- ubuntu安装armadillo说明
- 王道论坛《计算机网络》网课学习笔记