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 = ; 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 = ; s[i]; i++)
if(s[i] >= 'A' && s[i] <= 'Z')
printf("%c", ((s[i] - 'A' + k*f + ) % + 'A'));
printf("\n");
}
int main()
{
scanf("%d,%d ", &k1, &k2);
gets(plain);
gets(cipher);
encrypt(plain,k1,);
encrypt(cipher,k2,-);
return ;
}

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 = ;
while(b)
{
if(b & )
ans = (ans * k ) % n;
k = ( k * k) % n;
b >>= ;
}
return ans;
}
void init(char s[]) //预处理,转换为大写字母
{
int i;
for(i = ; s[i]; i++)
if(s[i] >= 'a' && s[i] <= 'z')
s[i] = s[i] - 'a' + 'A';
}
void encrypt(char s[]) //加密
{
init(s);
int k = ,i;
ll block = ;
for(i = ; s[i]; i++)
if(s[i] >= 'A' && s[i] <= 'Z') //如果是字母
{
block = block * + (s[i] - 'A') ; //明文对应的数字串
k++;
if(k == ) //够8位数字时
{
printf("%08lld", qpow(block, e) % );//输出密文,这个模不知道是不是必须的,题目没说n的上限
block = ;
k = ;
}
}
if(k)//剩下的明文要后面补零
{
while(k != )
{
block = block * ;
k++;
}
printf("%08lld", qpow(block, e) % );
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%lld%lld ", &n, &e);
gets(plain);
encrypt(plain);
return ;
}

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 << ], plain[];
ll exgcd(ll a, ll b)//扩展欧几里德求逆元
{
if(b == )
{
x = ;
y = ;
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 = ;
while(b)
{
if(b & )
ans = (ans * k ) % n;
k = ( k * k) % n;
b >>= ;
}
return ans;
}
void init()//求p和q,和d
{
int i;
for(i = ; i < n; i++)
if(n % i == )
{
p = i;
q = n / i;
break;
}
ll M;
M = (p - ) * (q - );
exgcd(e, M);
d = (x % M + M) % M;//求e的逆元d
}
void decrypt() //解密
{
ll block = ;
int k = , i, j;
for(i = ; cipher[i]; i++)
{
block = block * + cipher[i] - '';//密文从字符串中取出来
k++;
if(k == )//密文达到8位数字时
{
memset(plain, , sizeof plain);//清空明文字符串
block = qpow(block, d);//计算明文数字串
for(j = ; j >= ; j--)//每次计算两位数字并存在明文字符串中,因为从后面往前取,所以倒过来存
{
plain[j] = block % + 'A';//取最后面两个数字
block /= ;//去掉最后面两个数字
}
printf("%s", plain);//输出明文
k = ;//清空计数器
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%lld%lld ", &n, &e);
gets(cipher);
init();
printf("%d\n", d);
decrypt();
return ;
}

【kAriOJ】离散数学春季学期编程测试 1的更多相关文章

  1. 百度前端技术学院(IFE)2016春季学期总结

    今天(5月16日)作为第八个提交者提交了任务五十:RIA微型问卷管理平台 这样一个综合性的大任务,宣告我的IFE春季学期课程学习顺利完成.其实任务五十并不复杂,现在再让我来做,可能一周不到就写出来了, ...

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

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

  3. 2019年春季学期《C语言程序设计II》助教注意事项

    本学期<C语言程序设计II>课程安排 理论课时24(1-12周),实验课时8(13周),课程设计课时16(14-15周) 理论课教学内容 附:教学进度表 本学期实验课和课程设计参考教材 & ...

  4. 2019年春季学期《C语言程序设计II》课程总结

    2019年春季学期<C语言程序设计II>课程总结 1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型.运算符与表达式的自学情况,并讲解测验题目3.第 ...

  5. C#串口编程测试收发

    原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html   基本传递方法:RS232传输要有1位起始位,8位数据位.1位校验位( ...

  6. shell脚本编程测试类型下

    一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于  not equal-lt 是否小于-le 是否小 ...

  7. Task 异步编程测试案例及基础应用说明

    对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为tas ...

  8. USTC《现代软件工程》春季学期——第一次个人作业:词频统计

    截止日期 2018年3月29日23:59 要求 1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数. ...

  9. vertx异步编程测试

    vertx是异步编程的框架,性能较高,开发简单.异步编程就是当一个请求来了,vertx将其交由一个事件进行处理,然后继续向下执行,等处理完成,返回结果,通知客户端.这是一个由服务端反向调用客户端的过程 ...

随机推荐

  1. 原创翻译-测试驱动开发(TDD)

    测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...

  2. UESTC 913 握手 Havel定理+优先队列

    给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化.进一步,若图为简单图,则称此序列可简单图化. 此题因为是无自环无重边,所以是简单图.用判定简单图可图化 ...

  3. POJ 1442 Black Box -优先队列

    优先队列..刚开始用蠢办法,经过一个vector容器中转,这么一来一回这么多趟,肯定超时啊. 超时代码如下: #include <iostream> #include <cstdio ...

  4. 25个实用的jquery技巧

    1. 去除页面的右键菜单   $(document).ready(function(){ $(document).bind(“contextmenu”,function(e){returnfalse; ...

  5. 用运算符代替if、else

  6. iOS宏定义

    1.__OBJC__宏定义作用 在.pch 文件中一般都会自动加上这句宏定义,表示宏内引用的文件确保只被使用Objective-C语言的文件所引用,保证引用关系的清晰.因为在一个OC工程中,可能包含. ...

  7. Linux Shell编程一

    交互模式 --当Shell收到用户输入命令后,就开始执行这项命令,并把结果显示到屏幕上,结束后Shell又会显示系统提示符,等待用户输入下一条命令. 后台运行 --后台运行的符号为"& ...

  8. 使用C#改变鼠标的指针形状

    1.在一个无标题的窗体中用MOUSEMOVE事件判断鼠标坐标是否到达窗体的边缘,如果是的话将鼠标指针改为可调整窗体大小的双向箭头. private   void   Form1_MouseMove(o ...

  9. Java 征途:行者的地图 (转)

    http://www.cnblogs.com/mindwind/p/5251430.html Java 征途:行者的地图   前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走 ...

  10. PC网站应用接入微信登录

    参考文档: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&ve ...