当前位置: 首页 > 编程日记 > 正文

密码学是如何保护区块链的

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。

在这里插入图片描述

密码学是如何保护区块链的

摘要:密码学是应用数学函数以保证数据安全性的科学。 许多风靡的影视作品都在向人们暗示:只要有足够厉害的黑客,任何系统都可以被攻破。这种“好莱坞式黑客攻击”并不是真实世界的场景——黑客必须发现系统暴露的漏洞,例如未上锁的服务器机房、易于猜测的密码、未受保护的网络端口或者内部安装的“后门”,以进而实现未经授权的访问。

密码学是应用数学函数以保证数据安全性的科学。

许多风靡的影视作品都在向人们暗示:只要有足够厉害的黑客,任何系统都可以被攻破。这种“好莱坞式黑客攻击”并不是真实世界的场景——黑客必须发现系统暴露的漏洞,例如未上锁的服务器机房、易于猜测的密码、未受保护的网络端口或者内部安装的“后门”,以进而实现未经授权的访问。

虽然我们的确永远无法确保一个系统没有任何漏洞——毕竟系统都是由不完美的人类所完成的,但是“任何系统都可以被攻破”这一观点却是错误的。自90年代初以来,我们利用密码技术已经可以实现完全免受黑客攻击。但这一技术在应用时有时会留下被黑客利用的空间。

密码学本身并不会被黑客攻破以生成伪造的数字签名(马上会给出定义),就像数学不能被黑客攻击而使得2+2=5一样——虽然密码学和数学都可能被错误地使用。如果一个使用密码学的系统被攻破,那只可能是因为设计者错误地应用了密码学。这不是因为密码学不起作用,也不是因为有人“破解”了密码学——就像你的银行错误地处理了你的账户时不是数学的错误、你的妈妈下载不熟悉的附件而感染计算机病毒时不是电子邮件的错误一样。这是一个很重要的特点,因为比特币是一个非常直接的密码学应用。

密码学并不是一种未经考验的新技术。比特币所使用的所有密码学技术自互联网诞生以来一直都在使用着,是每天使用的许多常见互联网协议的重要部分。计算机科学家认为密码学是可靠和必要的,就像NASA(美国国家航空航天局)认为宇航科学是可靠和必要的一样。

公私钥对:密码学的基石

公私钥对是区块链所使用密码学的基石。公私钥对包含两部分:私钥和公钥。这两个密钥实际上只不过是具有特定数学关系的大整数,用于代替密码和用户名。

你会拥有一个公钥,就像你的名字或用户名一样:在大多数情况下,你可以向任意请求者分享你的公钥,而拥有它的人可以用它来引用或联系你。它与你的名声(或者比特币中你的交易历史)绑定,所以你可能会有多个公钥(因此有多个公私钥对)用于不同的目的。公钥可用于引用或查看帐户,但它自身并不能对该帐户作任何操作。

私钥应该像密码一样:不应向任何人分享,它用于验证某些操作,例如发送BTC(比特币)。

但是私钥和密码之间存在重要的区别。要使用密码,你必须将其发送给某个人或服务器,以便其对密码进行验证。你需要相信密码在发送后会被负责任地处理。相比之下,私钥可用于证明自己的身份而无需将其发送给任何人。它曾经存储或直接使用过的唯一场所就是在你的本地设备上。

这一点很重要,因为如果你可以在不向任何人发送你的秘密信息的情况下对自己进行身份认证,则可以保证完全控制其安全性——你不易受其他系统的安全漏洞影响。这是使比特币不可撼动的重要组成部分。比特币本身并没有存储可能泄露给攻击者的密码或私钥,但用户仍然可以对交易进行验证。

但是,如果你从来不曾向任何人发送私钥,那么如何使用私钥来验证交易呢?答案与私钥和公钥之间的数学关系有关:数字签名。

数字签名

有许多种不同的生成和验证数字签名的技术,支撑它们工作的数学原理远远超出了本文的范畴。对于那些不熟悉密码学的人来说,这里所描述的过程最初听起来可能令人难以置信。我很清楚地记得,当我四年前刚开始研究比特币的时候就有过这样的感觉。

现在我将再次简要提到,这些技术被用于许多常见的互联网协议中,并且是信息科学的既有组成部分。

想象有Alice和Bob两个人,他们已经在私下交换了公钥。Alice想给Bob发送一条消息,但Bob是一个非常多疑的人,除非他能够以数学的方式进行确定性地证明,否则他不相信该消息确实来自Alice。为了便于证明,他们同意使用数字签名。

为了生成签名,Alice使用她计算机中的签名生成算法,该算法将她的私钥和完整的消息作为输入,生成一个数字签名。然后,她将这个消息/签名组合发送给Bob——但重要的是,她不会发送她的私钥。

当Bob收到消息和签名时,他可以调用一个与之互补的签名验证算法。该算法将消息和签名作为输入,以确定Alice用于生成签名所使用公私钥对中的公钥。当Bob看到他的算法输出Alice的公钥时,他就已经在数学上证明了该签名确实是用Alice的公私钥对生成的,即使他不知道也无法计算Alice的公私钥对中的私钥。

更简洁地说,这一数字签名的过程允许Bob验证该消息不是由某个第三方创建或修改,而是必须使用Alice的私钥才能生成的,而不必(或不能)知道她的私钥。他需要的只有消息/签名组合和她的公钥。

直觉上来看,这似乎难以置信,你可能会觉得好像在哪里产生了误解。如果Alice的私钥和公钥密切相关,并且Alice使用她的私钥生成Bob收到的签名,那他为什么只能派生出她的公钥而得不到她的私钥?要理解这一问题的答案要求比大多数人对数学更深入的理解,这远远超出了本书的范围。

尽管如此,这项技术每天都在被赖以使用,并且在密码学社区内被认为是坚如磐石的。当你访问某个地址以https开头的网站时,“s”就表示该网站使用数字签名认证了它自己。你的计算机使用了签名验证算法,就像上面例子中的Bob一样,验证网站确实来自正确的公私钥对。数字签名可以确保你和网站之间的任何进一步交互都是经过加密和认证的。如果验证失败,浏览器则会警告你,并将该网站标记为危险。

足够大的整数

在此之前,我简单地提到了私钥和公钥的功能就像用户名和密码一样,但实际上它们只不过是具有特殊数学关系的大整数。鉴于此,我经常被问到以下问题:

“能不能使用计算机猜测或者计算出一堆数字,并尝试将它们作为私钥使用?他们最终是否会碰到某个目标公私钥对的私钥,从而获得对该身份的控制权?”事实上,就比特币而言,这将使攻击者可能窃取一些公私钥对所持有的比特币。

这是一个很好的问题,但它并不会发生。如前所述,有几个拥有价值数百万美元BTC的比特币地址,但它们好几年一直都没有被转移——尽管盗取它们需要的只是正确的私钥——也就是正确的大整数!如果你能猜到这些地址的私钥,那么你就可以将其中的钱发送给任何人。与密码不同,你可以在自己的机器上本地验证私钥,没有服务器会限制你的尝试次数或频率。

那为什么还没有人偷​​走这些钱呢?答案在于用作私钥的数字近乎荒谬的大小。它们足够大。

我们从一个简单的思维实验开始。想象一下,你的私钥足够大,大到世界上所有的计算机一起工作,他们需要24小时才能猜到。如果在你的私钥上增加仅仅一位数字,计算机就需要十倍的计算量,也就是需要十天而不是一天。而增加六位数字会使这一时间达到27000年。

在任何情况下,生成私钥所需创建随机数的计算能力都是微不足道的。使用私钥生成签名以及使用公钥验证这些签名在计算上也是简单的。但猜测私钥所需的工作量却随着每添加一个额外数字呈指数增长。为了使私钥“免疫”于暴力破解,我们只需要添加足够的数字——我们只需要使它们足够大。

那多大是足够大?比特币中使用的私钥是256比特的整数,相当于一个长度为76位的数字。这一数字的大小是令人难以置信的。接下来的阐释大部分来自于Bruce Schneier的图书《Applied Cryptography(应用密码学)》,对足够大整数进行直观说明。

首先,需要了解到热力学第二定律的一个具体结论是改变单个二进制位信息存在所需要的最小能量(将1变为0或反之)。这意味着无论所使用的硬件如何,任何计算过程都需要一些最小的能量来执行。

现在假设你能够利用太阳的全部能量输出来驱动一台专门设计的计算机,这台计算机的工作是计算或猜测私钥,以找到一个公私钥对的私钥(可以控制BTC)。

使用一点点数学和热力学,你会发现一台具有太阳全年能量输出计算能力的高效计算机可以计算出2178个值。如果我们将这个值除以可能的私钥数量,即2256,我们发现这个拥有太阳全年能量输出计算能力的假想计算机只能猜测或计算出可能私钥总数的0.0000000000000000000003%。

此外,这还只是计数,并不包括实际检验每个私钥以验证它是否与正确的公钥对应这一更复杂的任务。因此,这台计算机在一年之内可能错过这0.0000000000000000000003%概率的正确私钥,而它甚至都不会意识到。

这些数字与设备的技术无关; 它们是根据20世纪30年代以来建立的热力学定律所得出的可能达到的最大值。这些数字意味着对256位密钥(比特币使用的密钥)的暴力攻击将是不可行的,除非计算机是由物质以外的东西构建并占用空间以外的东西。

这就是足够大整数的能力。无论黑客有多厉害,除非他能够利用3×1023个太阳的能力计算一年,或者一个太阳的能力计算3×1023年,否则他的电脑甚至无法完成对所有私钥的计数——更不用说测试或者以其他方式使用它们了。

相关文章:

洛谷.4234.最小差值生成树(LCT)

题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差。 每次构成树时更新答案。答案就是当前边减去生成树上最小边的权值。 LCT…

python数字计算公式_Python中数字以及算数运算符的相关使用

Python数字 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 当你指定一个值时,Number对象就会被创建: var1 1 var2 10 您也可以使用del语句删除一些对象引用。 del语句的语法是&#…

软件测试安全测试高峰论坛

Nubia测试以及介绍 基于Cucumber的自动化测试平台 常见Web漏洞之XSS,主要HTML与JS基础、XSS的基础知识与挖掘方法、XSS的利用 自动化测试框架以及测试思路 转载于:https://www.cnblogs.com/ITniu/p/5776005.html

以太坊是什么,为什么这么火?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊是什么 以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使…

Python 把字符串变成浮点数

from functools import reducedi {}di.update(zip(1234567890., [1,2,3,4,5,6,7,8,9,0,.])) def str2float(s): st s.split(.) st1 reduce(lambda x,y: 10*x y, map(lambda x: di[x], st[0])) try: st2 reduce(lambda x,y: (x*0.1 y), map(lambda x:…

msbuild FileSysExcludeFiles

<?xml version"1.0" encoding"utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this pl…

python二分法求解_Python使用二分法求平方根的简单示例

这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。 对python这个高级语言感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编两巴掌来看看吧&#xff01; 使用二分法&#xff08;Bisection Met…

智能合约语言Solidity Solidity API

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 智能合约语言Solidity Solidity API Solidity 是以太坊智能合约编程语言&#xff0c;阅读本文前&#xff0c;你应该对以太坊、智能合约有所了解&am…

PHP PSR-4 Autoloader 自动加载(中文版)

引用&#xff1a;https://segmentfault.com/a/1190000002521658 Autoloader 关键词 “必须”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、“将会”("SHALL")、“不会”("SHALL NOT")、“应该”(&q…

236. Lowest Common Ancestor of a Binary Tree

原题链接&#xff1a;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ 代码实现如下&#xff1a; import java.util.LinkedList; import java.util.Queue; import java.util.Stack;/*** Created by clearbug on 2018/2/26.*/ public clas…

python中append的用法_Python 列表 append() 使用方法及示例

Python 列表 append() 使用方法及示例 append()方法将一个项目添加到列表的末尾。 append()方法将单个项目添加到列表的末尾。 append()方法的语法为&#xff1a;list.append(item) append()参数 该方法有一个参数item -要添加到列表末尾的项目 该项目可以是数字&#xff0c;字…

Web3与智能合约交互实战

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Web3与智能合约交互实战 以太坊中智能合约和web3交互实战 最近区块链、以太坊十分的火&#xff0c;所有就会有许多人去进入区块链这个工作&#x…

BZOJ 4595 SHOI2015 激光发生器 射线,线段,偏转

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id4595 题意概述&#xff1a; 给出一条射线和N条线段&#xff0c;射线遇到线段会发生反射&#xff0c;令入射角alpha&#xff0c;出射角beta&#xff0c;则betaalpha*phi_i&#xff08;即对于每条线段phi是…

实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

一&#xff0c;问题描述 实现一个栈&#xff08;元素遵守先入后出顺序&#xff09;&#xff0c;能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时&#xff0c;栈的基本操作&#xff1a;入栈(Push)、出栈(Pop)&#xff0c;也是在O(1)时间内完成的。 二&#xff0c;问题分…

华为js面试题_四面腾讯与华为,大厂前端面试真BT!

今年算是经历颇多的一年了&#xff0c;腾讯和华为都走了几趟&#xff08;一共面试了四个部门&#xff09;&#xff0c;拿了两个offer。&#xff08;开心.png&#xff09;&#xff0c;但还是挂了两次&#xff0c;有点遗憾。面试题总结面试完之后&#xff0c;赶紧总结了一波&…

你和区块链的距离就差这篇文章!

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 近年来&#xff0c;“区块链”逐渐成为热门话题&#xff0c;2018年各种关于区块链的行业资讯、投融资创业、技术和应用探索等集中爆发&#xff0c;…

Browser Security-超文本标记语言(HTML)

重要的4个规则&#xff1a; 1 &符号不应该出现在HTML的大部分节点中。 2 尖括号<>是不应该出现在标签内的&#xff0c;除非为引号引用。 3 在text节点里面&#xff0c;<左尖括号有很大的危害。 4 引号在标签内可能有危害&#xff0c;具体危害取决于存在的位置&…

NestedScrolling CoordinatorLayout

Android NestedScrolling机制完全解析 带你玩转嵌套滑动 一步一步深入理解CoordinatorLayout 源码看CoordinatorLayout.Behavior原理 转载于:https://www.cnblogs.com/cornellbox/p/8649891.html

python下载电脑版本不对_初学Python,因为某些原因电脑只能装3.1版本,现遇到这个小问题求解答...

#!/usr/bin/env python # -*- coding: utf-8 -*-任务: 假设用户输入的英文名字不规范&#xff0c;没有按照首字母大写&#xff0c;后续字母小写的规则&#xff0c; 请利用map()函数&#xff0c;把一个list&#xff08;包含若干不规范的英文名字&#xff09;变成一个包含规范英文…

以太坊是什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊是一个全新开放的区块链平台&#xff0c;它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样&#xff0c;以…

前端相关html和css

#请参考http://www.cnblogs.com/pycode/p/5792142.html #html css 和js说明 ##1.什么是html&#xff1f; HTML(HyperText MarkUp Language)超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行解析,然后把结果显示在网页上&#xff0c;通俗的讲它就是…

编写五子棋的完整python代码_python制作简单五子棋游戏

本文实例为大家分享了python五子棋游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 #五子棋 ‘” 矩阵做棋盘 16*16 “” 打印棋盘 for for 游戏是否结束 开始下棋 while 游戏是否结束&#xff1a; 黑白交替 player0 p%20 1 p1 下棋动作一样 但是棋子不一样 ‘”…

新建JRapid项目(idea创建maven多模块项目)

1、第一步&#xff0c;新建项目&#xff08;Create New Project&#xff09; 2、parent项目&#xff0c;不勾选“Crate from archetype”&#xff0c;直接单击“Next”。 3、groupid填写com.codingwhy&#xff0c;ArtifactId填写JRapid。 4、Project name 填写 JRapid&#xff…

这个美国议员候选人想发币,联邦选举委员会还答应了

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 佛罗里达州的一名国会候选人想给竞选志愿者发放基于以太坊的代币&#xff0c;以激励他们的工作&#xff0c;这是一项实验性的举措&#xff0c;而联邦…

day8 函数

写代码先画流程图 复习&#xff1a; 什么是文件&#xff1f; 文件操作 read&#xff08;&#xff09; with open&#xff08;&#xff09;as f: 取代close&#xff08;&#xff09; 文件的打开模式 t:text文本模式 只能操作文本 b:bytes字节模式 视频音频图片&#xff0c;也…

SQL Server中的分页查询

分页查询很简单&#xff0c;具体代码如下&#xff1a; --分页查询--查询1-3行数据 select top 3 * from emp order by sal desc;--查询4-6行数据 select top 3 *from empwhere empno not in (select top 3 empno from emp order by sal desc)order by sal desc;--查询7-9行数据…

python数据库建表_mysql数据表如何创建

在 MySQL 中&#xff0c;可以使用 CREATE TABLE 语句创建表。其语法格式为&#xff1a;CREATE TABLE <表名> ([表定义选项])[表选项][分区选项]; 其中&#xff0c;[表定义选项]的格式为&#xff1a;<列名1> <类型1> [,…] <列名n> <类型n> CREAT…

行情分析:下杀或不可持续,市场大概率继续震荡

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 美联储主席杰罗姆鲍威尔周三在众议院金融服务委员会的听证会上表示&#xff0c;在Facebook详细说明如何处理一系列监管问题之前&#xff0c;不应允许…

水平,垂直居中的15种方法

一.水平居中 1.文字水平居中 <div class"one">测试居中</div><style>.one{width: 200px;height: 100px;border:1px solid red;text-align: center;}</style>2.盒子居中 <div class"one">是盒子居中</div><style>…

Hadoop葵花宝典(一)

1. 描述如何安装配置Hadoop 参考&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 安装Linux(虚拟机上)—CentOS&#xff1a;创建用户&#xff0c;关闭防火墙&#xff0c;PS&#xff1a;不关防火墙无法访问Web管理页面&#xff0c;删除和增加节点…