代码如下:

#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语言)相关推荐

  1. 凯撒密码C语言去掉空格字符,凯撒密码C语言实现

    <凯撒密码C语言实现>由会员分享,可在线阅读,更多相关<凯撒密码C语言实现(8页珍藏版)>请在人人文库网上搜索. 1.凯撒密码是一种非常古老的加密方法, 相传当年凯撒大地行军打 ...

  2. 凯撒密码c语言小写字母,凯撒密码c(c语言编程凯撒密码)

    凯撒密码c(c语言编程凯撒密码) 2020-05-15 13:09:51 共10个回答 #include#includeintmain(){charsave[10][30];inta,b,i,j;sc ...

  3. 凯撒密码C语言去掉空格字符,凯撒密码的问题C语言

    满意答案 xlaijing19 推荐于 2016.04.01 采纳率:43%    等级:12 已帮助:6257人 最低0.27元开通文库会员,查看完整内容> 原发布者:耿万德 凯撒密码是一种非 ...

  4. 凯撒密码C语言用ASCII码,凯撒密码帮助ASCII循环

    我想创建一个凯撒密码,我有输入作为程序中的硬代码.当我运行该程序时,它的工作原理是,但应该是"Y"的所有内容都是"?".我无法弄清楚如何循环ASCII,所以当它 ...

  5. 凯撒密码c++语言程序,C++中的凯撒密码程序

    我想用C++编写凯撒密码程序.我使用了四个函数,一个用于选择Shift键,两个用于加密和解密,最后一个用于实现凯撒密码,使用输入文件读取文本并将加密或解密文本输出到输出文件中.我试图运行代码,它正在崩 ...

  6. 凯撒密码c++语言程序,凯撒密码(加密与解密)

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. /******************************************** ...

  7. 凯撒密码c语言公式原理,凯撒密码 C语言实现.pdf

    凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全.他的原理很简单, 说到底就是字母于字母之间的替换.下面 ...

  8. 洛谷小书童——凯撒密码——c语言

    题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密码是由 ...

  9. 2021.12.9洛谷小书童——凯撒密码——c语言

    题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密码是由 ...

最新文章

  1. android sdk软件开发套件,ANDROIDSDK-SITARA
  2. 单层神经网络-Logistics回归中误差曲线
  3. 调研Redis高可用两种方案
  4. sdn体系的三个平面_十张图看懂SDN与NFV的区别与联系?
  5. android 反射调用方法可不可以重载,使用Java进行反射投射和重载方法调度
  6. halcon圆环完整度检测
  7. Android MotionEvent中getX()、getRawX()和getTop()的区别
  8. restfull加签_SpringBoot RestFull API签名
  9. 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
  10. 【opencv学习】【图像金字塔】
  11. python三种基本数据类型_Python的三种基本数据类型
  12. Rust 多久更新一次?
  13. 总结几种简单实用的数据恢复技巧
  14. RxJava Subject
  15. 【DT调研】关于BIM + GIS的相关知识了解
  16. 电路交换,报文交换和分组交换的原理、区别、优缺点
  17. 图解CNN:通过100张图一步步理解CNN
  18. python:水果与设计模式-原型模式
  19. ubuntu安装armadillo说明
  20. 王道论坛《计算机网络》网课学习笔记

热门文章

  1. 托福考试可以用临时身份证吗?
  2. JSON中的JSON.parseArray()方法
  3. AI分割一切!智源提出通用分割模型SegGPT,「一通百通」的那种
  4. 目标分割(四)DeepLab v1讲解
  5. linux五种IO模型
  6. 世界互联网大会还是那个大会,互联网的江湖却变了半边天
  7. 二叉树4:二叉树的序列化和反序列化
  8. 用Keras单层网络预测银行客户流失率
  9. css设置字体大小会受分辨影响吗,CSS字体大小设置时的参考(转)
  10. markdown转义_Markdown语法示例