头歌—密码学基础

第1关:哈希函数

题目

任务描述

本关任务:利用哈希算法统计每个字符串出现的个数。

相关知识

为了完成本关任务,你需要掌握:1.密码学哈希函数的概念及特性,2.安全哈希算法。

密码学哈希函数的概念及特性

我们需要理解的第一个密码学的基础知识是密码学哈希函数,哈希函数是一个数学函数,具有以下三个特性: ● 其输入可为任意大小的字符串。 ● 它产生固定大小的输出。为使本章讨论更具体,我们假设输出值大小为256位,但是,我们的讨论适用于任意规模的输出,只要其足够大。 ● 它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)。 这些特性定义了一般哈希函数,以这个函数为基础,我们可以创建数据结构,例如哈希表。我们将只专注于加密的哈希函数,要使哈希函数达到密码安全,我们要求其具有以下三个附加特性:

  1. 碰撞阻力(collision−resistance
  2. 隐秘性(hiding
  3. 谜题友好(puzzle−friendliness

下面具体阐述这三个特性

  • 特性1:碰撞阻力 加密的哈希函数的第一个特性是它要具有碰撞阻力。这里的碰撞指对于两个不同的输入,产生相同的输出。如果对于哈希函数H(⋅),没有人能够找到碰撞,我们则称该函数具有碰撞阻力。即:如果无法找到两个值,xyx\\=y,而H(x)=H(y),则称哈希函数H具有碰撞阻力
  • 特性2:隐秘性 我们希望哈希函数拥有的第二个特性是其隐秘性。隐秘性保证,如果我们仅仅知道哈希函数的输出y=H(x),我们没有可行的办法算出输入值x。问题是,上述的表示形式不一定是正确的。考虑以下简单的例子:我们做一个抛硬币的实验,如果抛硬币结果为正面,我们会宣布字符串哈希为“正面”;如果结果为反面,我们会宣布字符串哈希为“反面”。 然后我们问我们的对手,在他没有见到抛硬币,而只见到哈希函数的输出的前提下说出哈希函数的输入字符串。为了回答问题,对手会简单计算“正面”字符串的哈希值及“反面”字符串的哈希值,然后对手便可以知道他得到的是哪一个。这样,只需要几步,对手就能反解出输入值。 对手能够猜出字符串,这是因为x只有两个可能,他可以很轻易地将两个可能对应的哈希值计算出来。为了能够实现隐秘性,我们需要x的取值来自一个非常广泛的集合,也就是说,仅仅通过尝试几个特定的x,就能找到输出值的方式将不会发生了。 现在的问题是:在类似抛硬币的“正面”、“反面”实验中,如果我们想要的反解的输入值并非来自分散的集合,我们是否还能得到隐秘性?幸运的是,对于这个问题答案是肯定的!我们甚至能够通过与另一个较为分散的输入进行结合,而将一个并不分散的输入进行隐秘。现在我们可以更精确地表示隐秘的含义了(双竖线为连接符号,代表把一系列事件、事情等联系起来)。即:哈希函数H具有隐秘性,如果:当其输入r选自一个高阶最小熵(highmin−entroy)的概率分布,在给定H(r‖x)条件下来确定x是不可行的
  • 特性3:谜题友好 哈希函数需要的第三个安全特性为谜题友好特性。这一特性较为复杂,我们首先解释该特性的技术要求,然后通过举例来阐释该特性的意义。 直觉上,谜题友好可以这样解释,如果有一个人想找到y值所对应的输入,假定在输入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。即: 如果对于任意n位输出值y,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在比2n小很多时间内找到x,保证H(k‖x)=y成立,那么我们称哈希函数H为谜题友好。
安全哈希算法

安全哈希算法(SecureHashAlgorithm256,简称SHA−256)。哈希函数有很多,但SHA−256是一个主要被比特币世界采用,并且效果还很不错的哈希函数。 回想一下,我们要求哈希函数可以用于任意长度输入。幸运的是,只要我们能建立一个用于固定长度输入的哈希函数,然后通过一般方法,就可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数,我们称这个转换过程为MDMerkle−Damgard)变换,SHA−256是采用这种变换方法的常用哈希函数之一。在通用术语中,这种基础型,可用于固定长度,具备碰撞阻力的哈希函数被称为是压缩函数(compressionfunction)。经过验证,如果基本压缩函数具有碰撞阻力的特性,那么经过转换而生成的哈希函数也具有碰撞阻力。 MD变换很简单。比如压缩函数代入长度为m的输入值,并产生长度短一些为n的输出值。哈希函数的输入(可为任意大小)被分为长度为m−n的区块。MD变换运作过程如下:将每个区块与之前区块的输出一起代入压缩函数,注意,输入长度则变为(m−n)+n=m,也刚好就是压缩函数的输入长度。对于第一个区块而言,之前没有的区块,我们需要选取一个初始向量。每次调用哈希函数,这个数字都会被再一次使用,而在实践中,你可以直接在标准文档中找到它。最后一个区块的输出也就是你返回的结果。 SHA−256函数利用了这样的一个压缩函数,这个压缩函数把一个768位的输入压缩成一个256位的输出,每一个区块的大小是512位。

编程要求

根据提示,在右侧编辑器补充代码,输出每个字符串的次数,具体格式看样例,输出按照字符串的字典序从小到大输出。

测试说明

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

测试输入:

 5 a ab abc a ab

预期输出:

 a 2 ab 2 abc 1

提示: 可以使用map<string,int>

代码

用map统计一下每个字符串出现的次数即可。

#include<bits/stdc++.h>
using namespace std;
//在下面Begin和End之间补全代码
/*********** Begin ***********/
int main()
{int n;cin>>n;string x;map<string, int> mp;for(int i=0; i<n; i++){cin>>x;auto it = mp.find(x);if (it != mp.end()) { // 键存在mp[x] = mp[x] + 1;} else {mp[x] = 1;}}for (auto i : mp) {cout << i.first << " " << i.second << endl;}return 0;
}
/*********** End ***********/

第2关:数字签名

题目

任务描述

本关任务:对给定的身份以及消息进行数字签名。

相关知识

为了完成本关任务,你需要掌握:1.数字签名的概念和性质,2.公钥即身份。

数字签名的概念和性质

数字签名是密码学中的第二个重要部分。数字签名被认为是对纸上手写签名的数字模拟。我们对数字签名有两个特性要求,使其与我们对手写签名的预期一致。

  • 第一,只有你可以制作你自己的签名,但任何看到它的人都可以验证其有效性;
  • 第二,我们希望签名只与某一特定文件发生联系,因此该签名不能用于表明你同意或支持另一份不同的文件。

对于手写签名来说,第二条就如同确保别人不能将你的签名从一份文件上剪下来,贴到另一份文件的末尾那样。 那我们如何通过密码学来构建这些性质呢?首先,让我们把之前的直观讨论说得更具体一些,以便今后可以更好地论证数字签名方案,并讨论其安全特性。 数字签名方案

(1)数字签名方案由以下三个算法构成: ● (sk,pk):=generateKeys(keysize)``generateKeys方法把keysize作为输入,来产生一对公钥和私钥。私钥sk被安全保存,并用来签名一段消息;公钥pk是人人都可以找到的,拿到它,就可以用来验证你的签名。 ● sig:=sign(sk,message) 签名过程是把一段消息和私钥作为一个输入,对于消息输出是签名。 ●isValid:=verify(pk,message,sig) 验证过程是通过把一段消息和签名消息与公钥作为输入,如果返回的结果是真,证明签名属实;如果返回的结果为假,证明签名消息为假。 (2)我们要求以下两个性质有效: ● 有效签名可以通过验证,即: verify(pk,message,sign(sk,message))==true ● 签名不可伪造。

公钥即身份

让我们来看一下与数字签名并行的一个有用技巧,基本想法是从数字签名模式中拿出一个公共验证密钥,并将其与一个人或一个系统参与者的身份对等。如果你见到一条消息的签名被公钥pk正确验证,那么你可以认为pk就是在表达这条消息。你真的可以将公钥认为是参与者或者系统的一方,他可以通过签署声明而发布声明。从这个角度来说,公钥就是身份,让某人能为pk身份发声,他必须知道相应的密钥sk。 将公钥视为身份的一个结果是,你可以随时制定新的身份——你可以简单通过数字签名方案中的generateKeys程序,生成新的密钥对skpkpk是你可以使用的新的公共身份,sk是相应的密钥,只有你自己知道并可以让你代表身份为pk发声。在实践中,你可能会使用pk的哈希作为你的身份,这是因为公钥很大。如果是这样的话,为了验证消息来自你的身份,人们会需要验证:

  • (1)你的身份确实是pk的哈希;
  • (2)信息能经过公钥pk验证。

此外,在默认情况下,你的公钥pk基本上看起来是随机的,也并没有人能够通过检查pk发现你的现实身份(当然,一旦你开始使用这个身份发表声明,这些声明可能泄露信息,而让别人将你的真实身份与pk联系起来。我们很快会更详细地讨论这个问题)。你可以生成一个看起来随机的新身份,看起来像人群中的一张脸,但这些都只有你能够控制。

编程要求

根据提示,在右侧编辑器补充代码,根据公钥即身份,我们可以模拟一次消息签名,假如你的身份是e,有哈希函数H(x)=ax+b,那么我们可以把pk=H(e)作为公钥,sk=H(e)−1modq作为私钥,我们用私钥对消息m进行加密,即en(m)=sk∗m,那么我们解密就可以这样计算de(en(m))=en(m)∗pk。这里q保证是素数。 输入

 e a b q m

输出

 pk sk en(m)

输入

 3 4 5 11 6

输出

17212

提示: 费马定理求逆元,可以查询一下。

代码

ksm求逆元

b 与 p 互质情况下,若 a/b ≡ a*x (mod p),则 x 为 b 的乘法逆元

可转化为 b * x ≡ 1 (mod p)

费马定理:若 p 为质数,得:bp-1 ≡ 1 (mod p)

又有:b * x ≡ 1 (mod p)

得到:b * bp-2 ≡ 1 (mod p),所以 x = bp-2

// 题目规定 p 是质数,我们使用费马定理需要 a p 是互质并且 p 是质数
// 只有 a 是 p 得倍数时,不互质if (a % p == 0) System.out.println("impossible");
else System.out.println(quick_power(a, p - 2, p));// 快速幂
private static long quick_power(long a, long k, long p) {long ans = 1;while (k > 0) {if ((k & 1) == 1) ans = ans * a % p;k >>= 1;a = a * a % p;}return ans;
}
#include<bits/stdc++.h>
using namespace std;
int e,a,b,q,m;// 快速幂求逆元
long ksm(long a, long k, long p) {long ans = 1;while (k > 0) {if ((k & 1) == 1) ans = ans * a % p;k >>= 1;a = a * a % p;}return ans;
}// 哈希函数
int H(int x) {return a * x + b;
}// 公钥
int pk() {return H(e);
}// 私钥
int sk() {return ksm(H(e), q-2, q);
}// 加密
int en() {return sk() * m;
}int main()
{cin>>e>>a>>b>>q>>m;cout << pk() << endl;cout << sk() << endl;cout << en() << endl;return 0;
}

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

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

相关文章

园区无线覆盖方案(智慧园区综合解决方案)

​ 李经理正苦恼头疼的工业园区数字化改造项目。近年企业快速增长,园区内Argent工业设备激增,IT部门应接不暇。为确保生产系统稳定运行,IT管理团队经过反复摸索,决定进行全面的数字化升级。然而改造之艰巨远超想象——混杂的接入环境、复杂的专线部署、长达数月的建设周期,种种…

uniapp连接蓝牙称(接收,发送)

复制即用&#xff0c;看好注释修改 用微信开发者的->真机调试&#xff0c;进行调试 <view>{{ www }}</view> //数据展示<template><view>{{ www }}</view> </template><script>export default {data() {return {bluetooth: fal…

通过网线连接的局域网电脑怎么实现上网功能

在机床里面的工控机有时候需要进行联网操作,但是又没有无线网或者外网网线,这时候可以通过笔记本的无线wifi功能实现上网功能. 通过网络适配器-找到wifi对应适配器-共享-1 打勾-2选中与工控机连接的网口-既可. 工控机端,将网口设置为自动获取IP

深度学习——第3章 Python程序设计语言(3.3 Python数据类型)

3.3 Python数据类型 目录 1. Python数值数据类型 2. Python库的导入和使用 3. Python序列数据类型 4. Python组合数据类型 计算机能处理各种类型的数据&#xff0c;包括数值、文本等&#xff0c;不同的数据属于不同的数据类型&#xff0c;有不同的存储方式&#xff0c;支持…

极狐gitlab ci job拉取代码之前执行命令

有时候我们希望可以在检索 Git 代码库和任何 submodules 之前执行一下命令操作&#xff0c;接下来为大家介绍下通过 hooks:pre_get_sources_script 可以满足该场景的使用。 文章目录 1. 开启 feature flag2. 使用方式方式1在 ci job 中定义 hooks.pre_get_sources_script 方式2…

从二叉搜索树到更大和树 : BST 中序遍历的经典运用

题目描述 这是 LeetCode 上的 「1038. 从二叉搜索树到更大和树」 &#xff0c;难度为 「中等」。 Tag : 「BST」、「中序遍历」 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜…

android通过广播打印RAM信息

通过广播打印ram相关log 参数说明&#xff1a; 广播&#xff1a;com.android.settings.action.RAM_INFO int型参数index&#xff1a;0 - 3h, 1 - 6h, 2 - 12h, 3 - 24h 代表过去时间app使用ram情况&#xff08;平均/最大占用&#xff09; Index: frameworks/base/services/cor…

Django 中的 HMAC 请求签名校验与 Vue.js 的完美协作

在 Web 应用的开发过程中,确保数据传输的安全性和完整性是一个不容忽视的问题。使用 HMAC(Hash-based Message Authentication Code)算法对请求内容进行签名校验,是一种常见且有效的安全策略。本文将详细介绍如何在 Django 后端实现 HMAC 签名校验,并展示如何在前端 Vue.j…

2023-简单点-树莓派中的硬件通讯

树莓派中的通讯方式 串口通讯什么是串口通讯&#xff1f;串口通讯的特点 tips并行通讯&#xff1f;基于网络的通讯?socket通讯 串口通讯 什么是串口通讯&#xff1f; 串行通信每次传输一个位元数据&#xff0c;并在连续进行单次过程的基础上进行通信。根据数据的传送方向&am…

leetcode_1094 拼车

1. 题意 有n段旅程&#xff0c;每段旅程由上车点、下车点、上车人数组成。 求给定的旅程是否能让所有旅程顺利完成。 拼车 2. 题解 首先肯定要将旅程按上车位置进行排序。 2.1 模拟小根堆 根据下车时间的早晚创建一个小根堆。 在每次进行新的旅程前判断是否有人下车了&am…

基于SSM+SpringBoot+Vue小区车位租赁系统

[技术实现] 小区车位租赁系统是使用SSMSpringBootVue前后端分离的管理系统。使用Spring框架可以在自动注入项目层级之间的调用对象&#xff0c;方便解耦&#xff0c;SpringMVC是体现了MVC设计思想的轻量级web框架&#xff0c;对web层进行解耦&#xff0c;使开发更简洁,MyBatis…

难以置信,一个小小的需求让我捣鼓出一个提效的网站来

难以置信&#xff0c;一个小小的需求让我捣鼓出一个提效的网站来 需求介绍 事情是这样的&#xff0c;有个群友在业务当中碰到一个小小的需求&#xff0c;需求是这样的: 页面当中存在多个输入框&#xff0c;输入框的 value 值是一个数值组成的字符串&#xff08;盲猜应该是身份…

关于开展人工智能专业人员“计算机视觉处理设计开发工程师”专项培训的通知

“人工智能技术与咨询”发布 工业与信息化部电子工业标准化研究院于2022年7月1日发布《人工智能从业技术人员要求》&#xff0c;现针对已发布标准于1月3日至7日在北京举办《自然语言与语音处理设计开发工程师》中级人才培养&#xff0c;下边是具体文件通知请大家查阅。行业人才…

CentOS7 关于 SELinux 的常用操作

SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个安全增强的 Linux 内核模块&#xff0c;用于提供更强大的访问控制和强制访问控制&#xff08;MAC&#xff09;机制。它通过在内核层面对进程和文件进行标记&#xff0c;并强制执行访问策略&#xff0c;提供了额外…

对一个多维随机变量作为线性变换以后的协方差矩阵

假设是一个n维的随机变量&#xff0c;它的协方差矩阵 对做线性变换&#xff0c;其中是一个矩阵&#xff08;当然也可以是一个标量&#xff09;&#xff0c;的协方差矩阵 证明如下&#xff1a; 将代入&#xff0c;得

游戏配置表的导入使用

游戏配置表是游戏策划的标配&#xff0c;如下图&#xff1a; 那么程序怎么把把这张配置表导入使用&#xff1f; 1.首先&#xff0c;利用命令行把Excel格式的文件转化成Json格式&#xff1a; json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Cli…

构建满足流批数据质量监控用火山引擎DataLeap

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 面对今日头条、抖音等不同产品线的复杂数据质量场景&#xff0c;火山引擎 DataLeap 数据质量平台如何满足多样的需求&#xff1f;本文将介绍我们在弥合大数据场景下…

Apache Flink(六):Apache Flink快速入门 - Flink案例实现

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

uniapp自定义进度条组件

目标效果 原型设计为这样的样式&#xff0c;但是现有的进度条都无法满足需求&#xff0c;于是编写组件实现。 设计引用格式为 <zLineProgress :total"15" :val"7" title"你好吗" />定义组件 <template><view style"hei…

Es6新特性

一、 let 声明变量 不能重复声明有块级作用域&#xff08;不影响作用域链&#xff0c;函数里可以拿到函数外的变量&#xff09;不存在变量提升 经典案列&#xff1a;&#xff08;把for里面的var i 0; 改成 let i 0就好了&#xff0c;不然items[i]就会报错&#xff09; 二、…