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相关推荐

  1. 2021春季学期-创新设计与实践-课程结构设计

    ▌01 课程背景 根据2021年之初,与自动化系张长水教授讨论,对于 2021春季学期-创新设计与实践-高级下 中关于工程部分(智能控制)内容,进行了初步的设计,详细参见: CDIE-2021春季课程 ...

  2. HIT-2022年春季学期《软件构造》Lab 1实验心得

    目录 2022年春季学期计算学部<软件构造> 课程Lab 1实验心得 1.实验目标概述 2.实验环境配置 3.实验过程 3.1 Magic Squares ​​​​​​​3.2 Turtl ...

  3. OO第四单元小结暨2019春季学期OO课程总结

    OO第四单元小结暨2019春季学期OO课程总结 目录: OO第四单元总结 一.总结本单元两次作业的架构设计 第一次作业 第二次作业 学期最终总结 二.四个单元中架构设计及OO方法理解 2.1 第一单元 ...

  4. 信号与系统 2022 春季学期第一次作业-作业题目准备

    简 介: 关于作业的参考答案需要根据之前结果,再结合现在的修改进行补充. 关键词: 作业,信号与系统 #mermaid-svg-HSmAT7ir1Kl95O1z {font-family:" ...

  5. 2021年春季学期-信号与系统-第二次作业参考答案-第十小题

    本文是 2021年春季学期-信号与系统-第二次作业参考答案 的参考答案. ▌第十题 10 从网络学堂下载代表两个信号的音频文件: 音频文件: f1(t)f_1 \left( t \right)f1​( ...

  6. 2021春季学期-创新设计与实践-Lesson4

    文章目录 ▌01 创新设计与实践 1.课程背景 2.同学分组 ▌02 课程内容设计 CI41 OpenCV简介 (1)OpenCV简介 CI411 (2)OpenCV安装 CI412 CI42 Ope ...

  7. 2021春季学期-创新设计与实践-Lesson3

    ▌01 创新与实践课程 1.课程背景 2021春季学期教学记录 课程中包括一门 2021春季学期-创新设计与实践-高级下 ,这个班级总共包括有10名来自于清华大学新雅学院的同学. 根据 2021春季学 ...

  8. 2019春季学期期末总结

    2019春季学期期末总结作业 一.我学到的内容 二.我的收获 作业连接 收获 第二周作业 文件的建立 第三周作业 二维数组 第四周作业 选择排序法 第五周作业 字符串数组 第六周作业 指针 第七周作业 ...

  9. 2019年春季学期第四周作业Compile Summarize

    这个作业属于哪个课程 C语言程序设计一 这个作业要求在哪里 2019春季学期第四周作业 我的课程目标 重新学习有关数组的问题 这个作业在哪个具体方面帮助我实现目标 对于置换有了新的见解 参考文献 中国 ...

最新文章

  1. ViewPager实现翻页步骤
  2. Application.DoEvents()的使用
  3. Cannot check for MySQL Daemon startup because of mysqladmin failure
  4. 执行计划oracle中cost,执行计划中cost计算方法
  5. java自定义表单_JSP实现用于自动生成表单标签html代码的自定义表单标签
  6. 百度网盘——下载限速问题解决方案(油猴(Tampermonkey)+PanDownload网页版+IDM)
  7. 服务于win10的telnet的简易聊天服务器(单进程)
  8. 目标检测算法——SSD
  9. 51Nod-1183-编辑距离
  10. mysql消除冗余_mysql剔除冗余数据
  11. 推荐系统与LSTM、GRU
  12. git pull时遇到的问题
  13. ADSP21489 Target halted due to software breakpoint but no breakpoint found at address: 0x208c0b6 ()
  14. 深度学习基础:SVD奇异值分解及其意义【转】
  15. 【温故知新】——HTML5重要知识点复习
  16. Assignment of attribute weights with belief distributions for MADM under uncertainties
  17. iwconfig 安装_ubuntu 无线网卡安装 | 学步园
  18. 谷粒商城项目篇14_分布式高级篇_订单支付
  19. el-date-picker组件错位(溢出浏览器)解决
  20. 【SQRT】函数使用技巧

热门文章

  1. html button 隐藏_java servlet与html数据交互初体验
  2. 剑指offer 算法 (位运算)
  3. springboot新版本(2.0.0+)自定义ErrorController中使用ErrorAttributes
  4. 十三: 悲观锁乐观锁:解决丢失更新问题
  5. 【MySQL】MySQL 如何实现 唯一随机数ID
  6. Oracle 11g R2 64位在 win7 64位的安装流程图解
  7. 数据可视化工具zeppelin安装
  8. 把磁盘崩溃了,总是进去维护模式,却删除不了fstab文件中的内容
  9. Golang gRPC 示例
  10. AVP 6目GoPro全景拼接