比特币中用到的密码学功能【区块链学习笔记1】

想要转到web3,这次学习区块链看的课是北大肖臻老师的公开课。

比特币又称是加密货币crypto-currency,但其实是不加密的,全是公开的。比特币中用到的密码学中HASH和签名。

1. HASH

密码学中的哈希:cryptographic hash function

三个重要的性质 

collision resistance (collision free)

该性质的作用:用来对一个message求digest(取数据摘要)【密码学相关内容,需要进行补充】 ,得到的哈希值即digest,用来检测这个message是否发生篡改,因为找不到一个H(m')=H(m),即没有办法篡改内容而又不被检测出来。(比如我的名字是柯意,全国有11个叫柯意的人,也就是hash碰撞是客观存在的。输入我的身份证号111222199608260000可以得到我的名字,但凡改掉身份证号中的其中一个数字,都得不到相同的名字,但是如果想改掉身份号又要得到同一个名字:柯意,就要在14亿人口的身份证号里进行尝试,概率是14亿分之11,微乎其微!)

在密码学中,“抗碰撞性”(collision resistance)是指一种理想的属性,用于描述加密哈希函数的安全性。一个具有抗碰撞性的哈希函数能够极大地降低找到两个不同输入,但却产生相同哈希输出的可能性。这是因为在理想情况下,任意两个不同的输入应该产生不同的哈希值。抗碰撞性是加密哈希函数重要的安全特性之一,对于防止数据篡改和确保信息完整性至关重要

并不是不发生哈希碰撞,但是找不到一个H(m')=H(m)

一般来说哈希碰撞是不可避免的,因为输入空间是远远大于输出空间的

比如说,有一个256位的哈希池,那么输出空间就是2的256次方(所有哈希值),但是输入空间是无限大的,有任意多种输入的可能性。按照鸽巢原理(又称为抽屉原理,它是组合数学中一个重要的原理),必然会出现两个输入被映射到同一个输出的情况。

举例:

如果要上传文件到云存储平台,使用的时候再下载,怎么保证下载的时候,和上传的时候是同一份文件?

可以在上传的时候先用这份文件算它的哈希值,将其存在本地,和下载的时候的进行比对。 

注:没有哪个Hash函数可以在数学上验证他是collision resistance的,只能依靠实践经验。

MD5:原先很安全,但是现在已经知道怎么人为地制造Hash碰撞

hiding

即:密码学的计算过程是单向的,是不可逆的

从哈希值无法反推“输入值”,这个哈希值没有泄漏有关输入的任何信息。成立的前提是:1.输入的空间足够大,输入的分布要比较均匀,各种取值的可能性是差不多的。无法暴力解开(brute-force)。

这个特性可以结合collision resistance用来实现:digital commitment(又称为 ditgital equivalent of a sealed envelope)

案例:对股市进行预测,怎么证明预测是否准确又不需要把预测结果提前公布而影响股票市场:提前把结果放到一个封好的信封中。--->不提前公布预测结果,可以提前公布预测结果的hash值。

x->H(x)

(这个例子中,股票市场作为输入空间,是不够大的,可以把“预测结果”加入一个随机数(加盐),将其整个取哈希。

H(x||nonce),nonce是随机数,保证这样拼接之后,输入是足够随机的,分布也是足够均匀的。)

puzzle friendly

hash的计算是事先不可预测的。光看这个输入,很难知道他这个hash值是什么。所以想要你算出来的hash值是落在某个范围之内的。那没有什么好办法你只能一个一个去试。看那个输入算出来是恰好落在要求的那个范围之内。

比特币是区块链,区块链就是一个一个区块组成的链表,每一个区块都有一个块头(block header), block header中有很多的域。 其中有一个域是我们可以设置的随机数nonce。挖矿实际上就是找一个nonce(随机数),这个nonce跟区块的块头里的其他信息合在一起,整个block header作为输入,取出一个哈希来,这个哈希值要小于等于某个指定的目标阈值。(整个的输出空间outspace。要求算出来的hash值只有前面这一点是合法的。这个是target space。)

H(block header) ≤ target.

puzzle friendly这个性质是指挖矿的过程没有捷径。只能够不停的去试大量的nonce,才能找到符合要求的解。因此这个过程才可以用来作为工作量证明, 叫做proof of work。 (挖到矿了找到了符合要求的的nonce,一定是因为你做了大量的工作。因为没有别的捷径。)

注:虽然挖矿的过程。需要很多的工作量,才能找到一个符合要求的nonce。但是一旦有人找到了这样一个nonce。发布出去之后,其他人要验证这个nonce是不是符合要求。 是很容易的,只要算一次hash就行了。这个nonce作为header的一部分,算一次hash值 看他是不是小于等于这个目标的阈值。挖矿很难验证很容易。这个性质叫做 difficult to solve,but easy to verify。我们设计这种mining puzzle的之后要注意这个性质。

比特币中用的hash函数是SHA-256,这个sha的意思是,secure hash algorithm.我们说的这三个性质它都是满足的。

2.签名

比特币系统中的账户管理:

日常生活中开个账户--->带上证件去银行办理开户手续--->中心化系统中的账户管理方式。

比特币是去中心化的,没有银行之类的这类机构。那怎么开账户呢?

每个用户自己决定开户。不需要任何人批准。

开户的过程:创立一个公钥和私钥的对pair(public key, private key)。在本地创立一个公私钥对,就是一个账户。这个就在比特币中代表了一个账户。

公私钥这个概念是来自非对称加密这个体系,叫做asymmetric encryption algorithm。最早的加密体系是对称的,叫做symmetric encryption algorithm

比如说两个人之间要进行通信,我要把某个信息发给你。但是这个通信的网络是有可能被窃听的。那怎么办呢。咱们两个事先商量一个密钥。一个叫做encyption key。我把这个信息加密之后发送给你。你收到之后再用这个密钥解密。因为这个加密和解密用的是同一个密钥。所以这个叫做对称的加密体系。他这个前提是假设。有某种安全的渠道。能够把这个密钥分发给通讯的双方。因为你显然的不能把这个密钥在网络上以明文的形式传输。我们假设网络本身就是不安全的。有可能被窃听,这个就是对称加密体系的一个弱点。密钥的分发不是很方便。解决这个问题非对称加密体系就提出来我们不是用一个密钥,而是用一对密钥。有一个公钥还有一个私钥。加密用的是公钥,解密用的是私钥,比如说我要把一个信息传给你,我用你的公钥给这个信息加密,你收到之后再用你的私钥解密。得到原来的信息。 大家注意这个加密和解密用的是同一个人的公钥和私钥。都是这个接收方的公钥和私钥。

这有什么好处呢?公钥是不用保密的,加密用的公钥是不用保密的,你可以告诉所有的人。有的人他的homepage就列出来他的pbk: public key。大家都可以知道。私钥是要保密的,解密是要用私钥解密的, 但是私钥只要保存在本地就行了,不用传给对方。就给你通讯的那个人不需要知道你的私钥。他是用你的公钥加密的。 你要回复他的话你用他的公钥加密。都不需要知道对方的私钥。这就解决了对称加密体系中密钥分发的不方便的问题。

比特币系统中呢,你要创建一个账户。就在本地产生一对公私钥。这个公钥就相当于你的银行账号。别人要给你转账,只要知道你的公钥就行了。这个私钥相当于你的账户密码。知道这个私钥就可以把这个账户上的钱转走。那么有一个问题我们前面说比特币系统是不加密的。他叫加密货币他其实不是加密的。 信息都是公开的,那我要这个公钥和私钥干什么呢?实际上用来做签名。

比如说我要转10个比特币给你。然后我这个交易发布到区块链上,别人怎么知道这个交易确定是我发起的呢?会不会是有人冒名顶替。偷偷把我帐上的钱转走呢?这就需要我在发布这个交易的时候要用我自己的私钥对这个交易进行签名,那其他人收到这个交易之后呢,在用我的公钥去验证这个签名的正确行。签名用的是私钥,验证签名用的是这个人的公钥

仍然都是同一个人。既然每一个人都是独立的产生账户。本地独立的生成公私钥对。不需要任何人相等,那万一两个人生成的公私钥对相同。怎么办?比如说有人想偷取比特币,一种方法是不停的产生公私钥。然后对比一下我产生的公钥。跟区块链上某个已有的公钥是不是相同。如果是一样的话,就可以用私钥把这个帐上钱给偷走。这种攻击方法从理论上说好像是可以的。但是实际当中是不可行的。比如说你是256位的hash值的话。产生相同的公私钥的可能性是微乎其微的。比如你有一台超级计算机每天产生大量的公私钥对。出现来两个人的公私钥对相同的情况概率也是可以忽略不计的。这个概率比地球爆炸的概率还要小。到目前为止还没有发现那个人用这种方法。能够攻击成功的先例。这里要强调一点,我们这里假设。产生公私钥的时候有一个好的随机源。这叫做a good source of randomness。生成公私钥的过程显然是随机的。如果选取的随机源不好的话,那么前面的分析就不存在了。就会出现两个人的公私钥对生成的是一样的。比特币中用的签名算法不光是,生成公私钥的时候要有好的随机源。之后每一次签名的时候也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。然后就全完了。这一点大家要一定注意。

我们讲了两个功能一个是hash,一个签名。 这两个功能是可以结合起来使用的。比特币系统中一般是先对一个消息求一个hash,然后在对这个hash值签名。

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

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

相关文章

【NLP练习】seq2seq

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、总结:seq2seq详解 1. seq2seq是什么 seq2seq(sequence to sequence)是一种常见的NLP模型架构,即&#xf…

c++图论基础(2)

目录 图的存储方式: 邻接矩阵: 代码实现: 邻接表: 代码实现: 邻接矩阵邻接表对比: 带权图: 邻接矩阵存储: 邻接表存储(代码实现): 图的存储方式: 邻…

【数据结构】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 Definition for singly-linked list.struct ListNode {int val;struct ListNode *next;};typedef struct ListNode ListNode; struct ListNode* mergeTwoLists(struct Lis…

小米消金强化普惠金融举措,构建消费者反诈安全屏障

近年来,随着通信技术的飞速发展,电信网络诈骗作为一种非接触性犯罪形式,给广大消费者带来了严重的经济损失,并对金融秩序造成了极大的破坏。为了应对这一严峻挑战,重庆小米消费金融有限公司(以下简称“小米…

【网络安全】对称加密、非对称加密以及密钥分配

目录 1、对称加密 2、非对称加密 3、如何分配对称密钥? 4、如何分配非对称密钥? 1、对称加密 所谓对称加密,就是指加密密钥与解密密钥都使用相同的密钥。如下图所示,通信双方使用的就是对称加密密钥。//代表:DES和…

代码随想录算法训练营第三十七天| LeetCode738.单调递增的数字

LeetCode 738 单调递增的数字 题目链接:738. 单调递增的数字 - 力扣(LeetCode) 【解题思路】 需要采用从后往前的遍历 如果发现该数字的前一位比后一位大,那么前一位就做-1处理,后一位变为9 注意:千万不…

《DiffusionNER: Boundary Diffusion for Named Entity Recognition》

Submitted 22 May, 2023; originally announced May 2023. Comments: Accepted to ACL 2023, submission version https://github.com/tricktreat/DiffusionNER 在这里插入图片描述 问题: 命名实体识别任务中存在的噪声跨度(边界不清晰&#xff09…

人工智能如何提高公司效率的 5 种方法

人工智能是当今最热门的话题之一,但并不是每个人都了解其对商业的价值规模。由此可见,现有的AI技术可以将企业的生产力提升40%。 在机器学习的帮助下,Netflix 利用自动化个性化推荐每年赚取 10 亿美元。当公司使用人工智能时,34%…

【QA】Git的底层原理

前言 本文通过一个简单的示例,来理解Git的底层原理。 示例 1、新建本地仓库并上传第一个文件 相关步骤: 新建仓库及创建文件查看文件状态将文件添加到暂存区将文件提交到本地仓库 HMTeenLAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-…

文件下载的N种方式

文件下载有多种方式可以实现。下面是其中几种常见的方式&#xff1a; 1.使用<a>标签的download属性 <template><a :href"fileUrl" download>点击下载文件</a> </template><script> export default {data() {return {fileUrl: h…

宝塔面板手动执行定时任务脚本的解决方案

在终端命令行执行定时任务&#xff0c;可以使用 cron 这个工具。cron 是 Unix、BSD、Linux 和类 Unix 操作系统中的工具&#xff0c;用于在固定时间、日期或间隔执行预定的命令。 为了每10分钟执行 /www/wwwroot/jwcsv.kwfw.net_20080/cron/test.sh 这个脚本&#xff0c;需要编…

【C语言】每日一题,快速提升(6)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a; 矩阵转置 有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09; 示例&#xff1a; 输…

深入了解Semaphore、CountDownLatch等实用工具的用法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

JRT质控打印

最近客户端打磨完了&#xff0c;又来推进质控了。之前演示的打印都是Demo示例&#xff0c;这次真正的写质控图的打印&#xff0c;数据就是质控数据录入界面录入的数据。其中质控图打印应该算最复杂的类型了。涉及JS的绘图&#xff0c;打印表格等&#xff0c;表格比较简单、还没…

端点安全管理系统干什么用的 有哪些好用?

你听说过&#xff1a; 端点安全管理系统吗&#xff1f; 我们一起来了解一下啊 一、什么是端点安全管理系统&#xff1f; 端点安全管理系统&#xff08;Endpoint Security Management System&#xff09;是一种专门用于保护企业内部网络终端设备的综合性安全解决方案。 这些终…

C++开发与学习平台@软件选择@代码跨平台问题@语言文档参考指南

文章目录 集成编译器的C/C开发工具(开箱即用)学习平台选择推荐&#x1f47a;初学者平台和软件选择开箱即用的C/C运行环境需要稍微配置的环境有经验的用户 小结&#x1f47a; AI辅助开发工具代码补全和AI代码片段生成补全 资料C代码跨平台问题&#x1f47a;C标准库ISO C非标准库…

全国省级金融发展水平数据集(2000-2022年)

01、数据简介 金融发展水平是一个国家或地区经济实力和国际竞争力的重要体现。它反映了金融体系的成熟程度和发展水平&#xff0c;是衡量一个国家或地区经济发展质量的重要指标。金融发展水平的提高&#xff0c;意味着金融体系能够更好地服务实体经济&#xff0c;推动经济增长…

Servlet(写一个Hello Worldt)【一】

文章目录 一、Servlet 目的 ----- 实现动态页面二、编写一个 Servlet 的Hello World2.1 创建项目2.2 处理文件夹2.3 引入依赖2.4 手动创建一些必要的目录/文件2.5 编写代码2.6 打包程序2.7 部署2.8 验证程序是否能正常工作 一、Servlet 目的 ----- 实现动态页面 静态页面 VS 动…

安卓免费抠图、AI绘图、修图软件——SnapEdit

一、前言 AI绘图原理主要基于深度学习和神经网络技术&#xff0c;通过训练数据集中的图像&#xff0c;从中学习并提取特征&#xff0c;进而生成新的图像。这一过程涉及到多种技术和模型&#xff0c;包括但不限于VAE&#xff08;变分自编码器&#xff09;、auto-encoder、GAN&a…

后端工程师——C++工程师如何准备面试?

相比 Java 语言方向,C++ 入门简单,精通难,找工作竞争压力更小,但 C++ 依然是近年来招聘的热门岗位之一。本文将从以下三个方面进行详细讲解,帮助你对 C++ 相关岗位的就业前景、岗位要求、学习路线等有更充分的了解。 C++工程师面试准备 上两篇文章对 C++ 工程师的招聘需求…