【kAriOJ】离散数学春季学期编程测试 1
A。凯撒密码
题意:
给你k1,k2,和一串明文,一串密文。
明文用k1加密,密文用k2解密。
对于明文要把字母转换成大写字母,非字母全部删除。
额:要考虑到取模可能会变成负数,所以要加一下26再取模。
代码:
#include<stdio.h> #define N 85 int k1, k2; char plain[N], cipher[N]; void init(char s[]) //预处理,转换为大写字母 {int i;for(i = 0; s[i]; i++)if(s[i] >= 'a' && s[i] <= 'z')s[i] = s[i] - 'a' + 'A'; } void encrypt(char s[],int k,int f)//加解密 {init(s);int i;for(i = 0; s[i]; i++)if(s[i] >= 'A' && s[i] <= 'Z')printf("%c", ((s[i] - 'A' + k*f + 26) % 26 + 'A'));printf("\n"); } int main() {scanf("%d,%d ", &k1, &k2);gets(plain);gets(cipher);encrypt(plain,k1,1);encrypt(cipher,k2,-1);return 0; }
B。RSA加密
题意:
给你n,e,和一串明文。用(n,e)加密明文。将明文字母转换成数字,按8位数字分段,不足部分补足0。明文中有非字母删除,A和a转成数字都是00, Z和z转成数字都是25。明文数字8位分段的每一段对应的密文也要求是8位,如果不足8位,前面补足0。
对于明文要把字母转换成大写字母,非字母全部删除。
补充:
RSA加密就是字母转化为两位数字,分段处理,比如每八个一段,M为明文数字段,C为密文数字段,C=Me%n。
代码:
#include<stdio.h> #include<string.h> #define N 1000 #define ll long long ll n, e; char plain[N]; ll qpow(ll a, ll b)//快速幂 {ll k = a % n;ll ans = 1;while(b){if(b & 1)ans = (ans * k ) % n;k = ( k * k) % n;b >>= 1;}return ans; } void init(char s[]) //预处理,转换为大写字母 {int i;for(i = 0; s[i]; i++)if(s[i] >= 'a' && s[i] <= 'z')s[i] = s[i] - 'a' + 'A'; } void encrypt(char s[]) //加密 {init(s);int k = 0,i;ll block = 0;for(i = 0; s[i]; i++)if(s[i] >= 'A' && s[i] <= 'Z') //如果是字母 {block = block * 100 + (s[i] - 'A') ; //明文对应的数字串k++;if(k == 4) //够8位数字时 {printf("%08lld", qpow(block, e) % 100000000);//输出密文,这个模不知道是不是必须的,题目没说n的上限block = 0;k = 0;}}if(k)//剩下的明文要后面补零 {while(k != 4){block = block * 100;k++;}printf("%08lld", qpow(block, e) % 100000000);} } int main() {// freopen("in.txt", "r", stdin);scanf("%lld%lld ", &n, &e);gets(plain);encrypt(plain);return 0; }
C。RSA解密
题意:
给你n,e,和一串明文。用(n,e)加密明文。将明文字母转换成数字,按8位数字分段,不足部分补足0。明文中有非字母删除,A和a转成数字都是00, Z和z转成数字都是25。明文数字8位分段的每一段对应的密文也要求是8位,如果不足8位,前面补足0。
对于明文要把字母转换成大写字母,非字母全部删除。
补充:
RSA加密就是字母转化为两位数字,分段处理,比如每八个一段,M为明文数字段,C为密文数字段,C=Me%n。
代码:
#include<stdio.h> #include<string.h> #define N 802 #define ll long long ll n, e, p, q, d, x, y; char cipher[N << 1], plain[10]; ll exgcd(ll a, ll b)//扩展欧几里德求逆元 {if(b == 0){x = 1;y = 0;return a;}ll r = exgcd(b, a % b);ll tmp = x;x = y;y = tmp - a / b * y;return r; } ll qpow(ll a, ll b)//快速幂 {ll k = a % n;ll ans = 1;while(b){if(b & 1)ans = (ans * k ) % n;k = ( k * k) % n;b >>= 1;}return ans; } void init()//求p和q,和d {int i;for(i = 2; i < n; i++)if(n % i == 0){p = i;q = n / i;break;}ll M;M = (p - 1) * (q - 1);exgcd(e, M);d = (x % M + M) % M;//求e的逆元d } void decrypt() //解密 {ll block = 0;int k = 0, i, j;for(i = 0; cipher[i]; i++){block = block * 10 + cipher[i] - '0';//密文从字符串中取出来k++;if(k == 8)//密文达到8位数字时 {memset(plain, 0, sizeof plain);//清空明文字符串block = qpow(block, d);//计算明文数字串for(j = 3; j >= 0; j--)//每次计算两位数字并存在明文字符串中,因为从后面往前取,所以倒过来存 {plain[j] = block % 100 + 'A';//取最后面两个数字block /= 100;//去掉最后面两个数字 }printf("%s", plain);//输出明文k = 0;//清空计数器 }} } int main() {// freopen("in.txt", "r", stdin);scanf("%lld%lld ", &n, &e);gets(cipher);init();printf("%d\n", d);decrypt();return 0; }
【kAriOJ】离散数学春季学期编程测试 1相关推荐
- 2021春季学期-创新设计与实践-课程结构设计
▌01 课程背景 根据2021年之初,与自动化系张长水教授讨论,对于 2021春季学期-创新设计与实践-高级下 中关于工程部分(智能控制)内容,进行了初步的设计,详细参见: CDIE-2021春季课程 ...
- HIT-2022年春季学期《软件构造》Lab 1实验心得
目录 2022年春季学期计算学部<软件构造> 课程Lab 1实验心得 1.实验目标概述 2.实验环境配置 3.实验过程 3.1 Magic Squares 3.2 Turtl ...
- OO第四单元小结暨2019春季学期OO课程总结
OO第四单元小结暨2019春季学期OO课程总结 目录: OO第四单元总结 一.总结本单元两次作业的架构设计 第一次作业 第二次作业 学期最终总结 二.四个单元中架构设计及OO方法理解 2.1 第一单元 ...
- 信号与系统 2022 春季学期第一次作业-作业题目准备
简 介: 关于作业的参考答案需要根据之前结果,再结合现在的修改进行补充. 关键词: 作业,信号与系统 #mermaid-svg-HSmAT7ir1Kl95O1z {font-family:" ...
- 2021年春季学期-信号与系统-第二次作业参考答案-第十小题
本文是 2021年春季学期-信号与系统-第二次作业参考答案 的参考答案. ▌第十题 10 从网络学堂下载代表两个信号的音频文件: 音频文件: f1(t)f_1 \left( t \right)f1( ...
- 2021春季学期-创新设计与实践-Lesson4
文章目录 ▌01 创新设计与实践 1.课程背景 2.同学分组 ▌02 课程内容设计 CI41 OpenCV简介 (1)OpenCV简介 CI411 (2)OpenCV安装 CI412 CI42 Ope ...
- 2021春季学期-创新设计与实践-Lesson3
▌01 创新与实践课程 1.课程背景 2021春季学期教学记录 课程中包括一门 2021春季学期-创新设计与实践-高级下 ,这个班级总共包括有10名来自于清华大学新雅学院的同学. 根据 2021春季学 ...
- 2019春季学期期末总结
2019春季学期期末总结作业 一.我学到的内容 二.我的收获 作业连接 收获 第二周作业 文件的建立 第三周作业 二维数组 第四周作业 选择排序法 第五周作业 字符串数组 第六周作业 指针 第七周作业 ...
- 2019年春季学期第四周作业Compile Summarize
这个作业属于哪个课程 C语言程序设计一 这个作业要求在哪里 2019春季学期第四周作业 我的课程目标 重新学习有关数组的问题 这个作业在哪个具体方面帮助我实现目标 对于置换有了新的见解 参考文献 中国 ...
最新文章
- ViewPager实现翻页步骤
- Application.DoEvents()的使用
- Cannot check for MySQL Daemon startup because of mysqladmin failure
- 执行计划oracle中cost,执行计划中cost计算方法
- java自定义表单_JSP实现用于自动生成表单标签html代码的自定义表单标签
- 百度网盘——下载限速问题解决方案(油猴(Tampermonkey)+PanDownload网页版+IDM)
- 服务于win10的telnet的简易聊天服务器(单进程)
- 目标检测算法——SSD
- 51Nod-1183-编辑距离
- mysql消除冗余_mysql剔除冗余数据
- 推荐系统与LSTM、GRU
- git pull时遇到的问题
- ADSP21489 Target halted due to software breakpoint but no breakpoint found at address: 0x208c0b6 ()
- 深度学习基础:SVD奇异值分解及其意义【转】
- 【温故知新】——HTML5重要知识点复习
- Assignment of attribute weights with belief distributions for MADM under uncertainties
- iwconfig 安装_ubuntu 无线网卡安装 | 学步园
- 谷粒商城项目篇14_分布式高级篇_订单支付
- el-date-picker组件错位(溢出浏览器)解决
- 【SQRT】函数使用技巧
热门文章
- html button 隐藏_java servlet与html数据交互初体验
- 剑指offer 算法 (位运算)
- springboot新版本(2.0.0+)自定义ErrorController中使用ErrorAttributes
- 十三: 悲观锁乐观锁:解决丢失更新问题
- 【MySQL】MySQL 如何实现 唯一随机数ID
- Oracle 11g R2 64位在 win7 64位的安装流程图解
- 数据可视化工具zeppelin安装
- 把磁盘崩溃了,总是进去维护模式,却删除不了fstab文件中的内容
- Golang gRPC 示例
- AVP 6目GoPro全景拼接