头歌—衍生密码体制

# 第1关:Rabin密码体制

题目描述


任务描述

Rabin密码体制是RSA密码体制的一种。 本关任务:使用Rabin密码体制对给定的明文进行加密。

相关知识

为了完成本关任务,你需要掌握:Rabin密码体制。

Rabin密码体制

在本关中,我们描述Rabin密码体制,假定模数n=pq不能被分解,则该类体质对于选择明文攻击是计算安全的。因此Rabin密码体制提供了一个可证明安全的密码体制的例子:假定分解整数问题是计算上不可行的,Rabin密码体制是安全的,我们现在来描述Rabin密码体制。

Rabin密码体制:设n=pq,其中pq为素数,且p,q≡3(mod4)。设P=C=Zn∗,且定义:K=(n,p,q)。 对于K=(n,p,q),定义 eK(x)=x2mod n 和dK(y)=(y)mod n,其中n的值为公钥,pq为私钥。

Rabin密码体制的一个缺点是加密函数并不是一个单射,所以解密不能以一种明显的方式完成。我们证明如下。假定y是一个有效的密文,这意味着y=x2mod n,对于某一`x∈Zn

让我们从Bob的观点来看解密问题。它得到一个密文y,且想找出 x 使得

x2y(mod n)

这是一个关于Zn中未知元x的二次方程,解密需要求出模n的平方根。这等价于求解两个同余方程:

z2≡y(mod p)z2≡y(mod q)

我们可以利用欧拉准则,来判断y是否为一个模p的二次剩余。实际上如果加密正确地执行,则y是一个模p和模q的二次剩余。不幸的是,欧拉准则并不能帮我们找到y的平方根,他仅能得到一个“是”或“否”的答案。

p≡3(mod 4)时,有一个简单公式来计算模p二次剩余的平方根。假定y是一个模p二次剩余,且p≡3(mod 4),那么我们有:

(±y(p+1)/4)2≡y(p+1)/2(mod p)

≡y(p−1)/2y(mod p)

≡y(mod p)

这里我们又一次使用了欧拉准则,即如果y是一个模p二次剩余,那么`y(p−1)/2≡1(mod p)

因此,yp 的两个平方根为

±y(p+1)/4(mod p)。

同样的讨论,可知 yp 的两个平方根为

±y(q+1)/4(mod q),

然后可以直接用中国剩余定理来得到yn的四个平方根。

: 我们用一个小例子来说明Rabin密码体制的加密和解密过程,假定n=77=7×11。那么加密函数为:

eK(x)=x2mod 77

且解密函数为:

dK(y)=y1/2mod 77

假定Bob需要解密密文y=23。首先需要找到237和模11的平方根。由于711都是模43,我们利用前面的公式:

23(7+1)/4≡22≡4(mod 7)` `23(11+1)/4≡13≡1(mod 11)

利用中国剩余定理,我们计算2377的四个平方根为±10,±32mod 77。因此,四个可能的明文为x=10,32,45,67。可以验证这四个明文平方后模77,约化得到的值为23。这证明了23是一个有效的秘文。

编程要求

根据提示,补全右侧编辑器中 Begin-End 区间的代码,给定模数n和明文x,要求使用Rabin密码体制进行加密。具体要求如下:

  • 从后台获取两个数字nx,输出加密后的密文。

测试说明

平台会对你编写的代码进行测试:

测试输入:

84773093 84754668

预期输出:

8887 9539

思路

看到了这段:

image-20231206112218758

顺手试了一下就成了,没往深了想。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll  long  long
ll e(ll x, ll n);
int main()
{int n,x;cin>>n>>x;printf("%lld", e(x, n));return 0;
}ll e(ll x, ll n) {return (x*x) % n;
}

第2关:RSA的语义安全

题目描述

任务描述

前面所说的所有攻破密码体制,实际上是试图找出秘密密钥(对称密码体制的情形)或者私钥(公钥密码体制的情形)。然而,可能敌手的目标并没有那么大的野心,即不能找到秘密密钥或者私钥,他仍可以获得比我们所希望的更多的信息,如果要确保一个密码体制是“安全”的,我们应该考虑这些敌手所具有的适度的目标。

本关任务:给定h表和n的值,利用二分搜索求解出明文。

相关知识

为了完成本关任务,你需要掌握:RSA的语义安全。

RSA的语义安全

到现在为止,我们假定敌手试图攻破密码体制以找出秘密密钥。如果Oscar能够做到这一点,那么密码体制被完全攻破。然而,可能敌手的目标并没有这么大的野心。即使Oscar不能找到秘密密钥或公钥,他仍然可以获得比我们所希望的更多的信息。如果我们要确保一个密码体制是“安全的”,我们应该更准确的估计敌手的目的。 下面列出了潜在的敌手的目的。

完全攻破 敌手能够找出Bob的秘密密钥或者私钥。因此他能解密利用给定密钥加密的任意密文。

部分攻破 敌手能以某一不可忽略的概率解密之前没有见过的密文。或者,敌手能够对于给定的密文,得出明文的一些特定信息。

密文识别 敌手能够以超过1/2的概率识别两个不同明文对应的密文或者识别出给定明文的秘文和随机字符串。

在下面的内容中,我们考虑一些针对RSA类密码体制达到上面某种类型目的可能攻击。我们也介绍在一定的计算假设成立的情形下,如何构造一个公钥密码体制使得敌手不能在多项式时间内识别密文,这样的密码体制称为达到了语义安全。达到语义安全是非常困难的,因为我们是在对抗敌手非常弱的、容易达到目的的攻击。

一些密码体制的弱点就是明文的部分信息可以通过密文“泄露”出去。这表示是对系统的一种部分攻破,实际上它在RSA密码体制中发生了。假定我们给定密文,

y=xbmod n,

其中x表示明文。由于gcd(b,ϕ(n))=1,必然是 b 为奇数的情形。因此 jacobi 符号为

image-20231206112523889

所以,给定密文y,任何人无需解密密文就可以有效地计算(nx)。也就是说,一个RSA加密“泄露”了一些有关明文的信息,即Jacobi符号(nx)的值。

在本关中,我们考虑一些由密码体制泄露的其他特定类型的部分信息:

1.给定y=eK(x),计算parity(y),其中parity(y)表示x的二进制表示的最低位数。 2.给定y=eK(x),计算half(y),其中0≤x≤n/2时,half(y)=0;当n/2<x≤n−1时,half(y)=1

我们将证明假定RSA加密是安全的,RSA密码体制不会泄露这种类型的信息。更精确的说,我们将证明RSA密码解密问题可以Turing约化为计算half(y)的问题。这意味着如果存在一个多项式算法计算half(y),那么存在RSA解密的多项式时间算法。也就是说,计算关于明文的特定信息,即half(y),不会比解密密文得到整个明文来得容易。

我们现在讨论,在给定计算half(y)的假设算法的前提下,如何计算y=dK(x),算法如下所示。

img

我们对算法的原理做一下解释。首先,我们注意到RSA加密函数满足在Zn中的如下乘法性质: eK(x1)eK(x2)=eK(x1x2)

现在利用如下事实: y=eK(x)=xbmod n

容易看到,对于0≤i≤⌊log2n⌋ ,第一个for循环运行第i次时有: hi=half(y×(eK(2))i)==half(eK(x×2i))

我们观察到

img

等等,因此我们利用二分检索技巧来找到x,这就是第二个for循环中完成的。下面用一个小例子来说明。 假定n=1457,b=779,且我们有一个密文y=722。然后假定,我们利用预言Half,我们得到如下hi值:

img

然后我们利用二分查索过程,如下表所示,因此明文为y=⌊999.55⌋=999

img

编程要求

根据提示,补全右侧编辑器中 Begin-End 区间的代码,给定h表和n的值,利用二分搜索求解出明文。具体要求如下:

  • 从后台获取一个字符串

    h
    

    和一个整数

    n
    

    ,利用二分搜索求解明文并输出。

    测试说明

平台会对你编写的代码进行测试:

测试输入:

10101111100
1457

预期输出:

999

思路

字符串是h表,题目已经给出了,我们只需要二分查找y的值即可,向下取整。

过程就是下面这个图,共二分h次,h=1时,l = mid,h=0,r = mid

img

img

代码

#include<bits/stdc++.h>
using namespace std;
#define ll  long  long
char h[100];int main()
{int n;scanf("%s",h);scanf("%d",&n);int len = strlen(h);double l = 0, r = n, mid = 0;for (int i = 0; i < len; i++) {mid = l + (r - l) / 2;if (h[i] == '1') l = mid;else r = mid;}cout << int(floor(mid));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rk3588多模型检测部署quickrun

quickrun 是一款rk3588 rknn多模型高效高并发部署软件 软件框架 采用session思想&#xff0c;可以定义多个session满足不同模型的义务需求。比如充电桩检测&#xff0c;垃圾分类&#xff0c;悬崖检测&#xff0c;模型共用一个摄像头&#xff0c;采用yolov5的模型。 采用消息…

C语言之初识C语言

文章目录 前言一、什么是C语言二、第一个C语言程序三、数据类型四、变量&#xff0c;常量1、变量1.1 变量的命名1.2 变量的分类1.3 变量的使用1.4 变量的作用域和生命周期2、变量 五、字符串1. 概念2. 求解字符串的长度【strlen】3. 转义字符【含笔试题】 六、注释七、选择语句…

UE5 Landscape 制作GIS卫星图地形

1. 总体想法&#xff1a; 制作GIS地形&#xff0c;使用Landscaping MapBox是一个好方法&#xff0c;但是区域过大&#xff0c;会占用很多内存 https://blog.csdn.net/qq_17523181/article/details/135029614 如果采用QGis&#xff0c;导出卫星图&#xff0c;在UE5里拼合出地形…

Prometheus实战篇::什么是Exporter

欢迎各位关注下我的微信公众号:全干程序员demo 回复 “java面试” 获取[java精品面试题] 回复 “idea” 获取[idea2023最新版破解至2099年] 回复"自媒体" 获取个人自媒体笔记:玩转字节跳动平台(可以联系我催更,有时可能因为工作或者发布文章没空更新,因为笔记都是我自…

Centos安装Docker及使用

文章目录 配置要求Centos安装Docker卸载docker&#xff08;可选&#xff09;安装docker首先需要大家虚拟机联网&#xff0c;安装yum工具然后更新本地镜像源&#xff1a;然后输入安装docker命令&#xff1a;查看docker的版本 启动docker关闭防火墙接着通过命令启动docker 配置镜…

数学建模学习笔记-皮尔逊相关系数

内容&#xff1a;皮尔逊相关系数 一.概念&#xff1a;是一个和线性线关的相关性系数 1.协方差概念&#xff1a; 协方差受到量纲的影响因此需要剔除 2.相关性的误区 根据这个结论&#xff0c;我们在计算该系数之前需要确定是否为线性函数 二.相关性的计算 1.Matlab&#xff…

Enge问题解决教程

目录 解决问题的一般步骤&#xff1a; 针对"Enge问题"的具体建议&#xff1a; 以下是一些普遍适用的解决问题的方法&#xff1a; 以下是一些更深入的Enge浏览器问题和解决办法&#xff1a; 浏览器性能问题&#xff1a; 浏览器插件与网站冲突&#xff1a; 浏览…

MsSQL中的索引到底长啥样,查找过程怎么进行

参考文章一 参考文章二 建表 mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> index idx_age (age)-> )engineinnodb charsetutf8mb4;insert into user(name,age) values(张三,…

键盘失灵?别慌!三招帮你调出电脑软键盘

在电脑使用中&#xff0c;我们有时候需要输入文字&#xff0c;但可能会遇到键盘突然失灵的情况。这时&#xff0c;我们可以使用电脑自带的软键盘来解决问题。本文将介绍如何调出电脑软键盘&#xff0c;以便在需要时进行文字输入。 下面以Windows10系统电脑调出软键盘为例进行演…

JSON Web Token JWT几种简单的绕过方法

JWT结构 JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 JWT常被用于前后端分离&#xff0c;可以和Restful API配合使用&#xff0c;常用于构建身份认证机制 如图为JWT加密后的示例&…

[数据结构进阶 C++] 二叉搜索树(BinarySearchTree)的模拟实现

文章目录 1、二叉搜索树1.1 二叉搜索数的概念1.2 二叉搜索树的操作1.2.1 二叉搜索树的查找1.2.2 二叉搜索树的插入1.2.3 二叉搜索树的删除 2、二叉搜索树的应用2.1 K模型2.2 KV模型 3、二叉搜索树的性能分析4、K模型与KV模型完整代码4.1 二叉搜索树的模拟实现&#xff08;K模型…

SuperMap Hi-Fi 3D SDK for Unity矢量面贴地贴模型

作者&#xff1a;kele 一、背景 SuperMap Hi-Fi 3D SDK&#xff08;2023 11i&#xff09; for Unity推出新功能&#xff1a;支持矢量面同时贴地形图层和模型图层&#xff0c;并且能实现数据点击查询属性、更改初始填充颜色、初始边框线颜色、选中填充颜色、选中边框线颜色、控…

Redis-学习笔记

Remote Dictionary Server(Redis) 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API&#xff0c;是跨平台的非关系型数据库。 Redis 通常被称为数据结构服务器&…

系列十二(面试)、Java中的GC回收类型有哪些?

一、Java中的GC回收类型 1.1、概述 Java中的GC回收类型主要包含以下几种&#xff0c;即&#xff1a;UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC。 1.2、源码

【Linux笔记】文件查看和编辑

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

EfficientDet:Scalable and Efficient Object Detection中文版 (BiFPN)

EfficientDet: Scalable and Efficient Object Detection EfficientDet&#xff1a;可扩展和高效的目标检测 摘要 模型效率在计算机视觉中变得越来越重要。本文系统地研究了用于目标检测的神经网络架构设计选择&#xff0c;并提出了几个关键的优化方法来提高效率。首先&…

Leetcode—剑指Offer LCR 025.两数相加II【中等】

2023每日刷题&#xff08;六十七&#xff09; Leetcode—LCR 025.两数相加II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode…

State of PostgreSQL 2023 报告解读

基于 PostgreSQL 内核的时序数据库厂商 Timescale 发布了一年一度的 State of Postgres 2023 报告。 Timescale 介绍 简单先介绍一下 Timescale 这家公司的历史。它最早是提供了一个 PG 的插件&#xff0c;引入了 Hypertable 这个概念&#xff0c;来高效地处理时序数据&…

飞天使-k8s知识点5-kubernetes基础名词扫盲

文章目录 deploymentspodNodeserviceskubectl 实现应用伸缩kubectl 实现滚动更新kubernetes架构 deployments 中文文档 http://docs.kubernetes.org.cn/251.htmldeployment是用来创建和更新应用的&#xff0c;master 会负责将创建好的应用实例调度到集群中的各个节点 应用实例…

YOLOv8算法改进【NO.96】针对小目标检测有效果的ASF-YOLO

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…