当前位置: 首页 > news >正文

区块链技术与应用1——BTC-密码学原理

文章目录

    • 比特币中的密码学原理
      • 1. 哈希函数
      • 2. 数字签名
      • 3. 比特币中的哈希函数和数字签名

简单介绍:比特币与以太坊都是以区块链技术为基础的两种加密货币,因为他们应用最广泛,所以讲区块链技术一般就讲比特币和以太坊。

比特币中的密码学原理

1. 哈希函数

– 比特币中哈希函数的性质:

(1)抗碰撞性(collision resistance):

哈希碰撞:

输入:x,y 其中x不等于y
输出:H(x) = H(y)

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

这里的哈希函数的抗碰撞性是指给定一个x,很难(注意是很难,而不是不能)找到一个y(x不等于y),使得H(x)=H(y)

抗碰撞性的意义(用途):用来保证信息完整性,给定一个message,对这个message求哈希值,如果对该message进行了篡改(尽管是很小的修改),那么它的哈希值H(message)就会发生巨大改变。

(2)单向性(隐藏性hiding)

给定一个x,很容易计算出H(x),但给定H(x),却很难计算出x。

达成单向性的前提:输入空间足够大,并且输入空间的分布要相对均匀,使得每种输入取值可能性都基本相等,使得无法通过暴力输入x,来算出给定的H(x)。

实际应用中,如何让输入空间足够大并且输入空间分布相对均匀?
答:通常是在输入x后面添加一个随机数nonce,计算H(x||nonce)

单向性的意义(用途):与抗碰撞性结合可以实现数字等效的密封信封

a. 将预测结果作为输入x,计算出一个H(x)。
b. 将H(x)保存好,由于H(x)很难计算出x,因此无法提前知道预测结果
c. 当结果出来之后,公布预测结果x,计算H(x)是否和保存好的H(x)相等,由于抗碰撞性,预测结果x很难被篡改,保证了x的完整性。
d. 由此就完成了一个数字等效的密封信封。

(3)谜题友好(puzzle friendly)

哈希值的计算是不可预测的,只看输入x但不计算,很难获得H(x)。即如果你想得到一个H(x)落在某个区间范围内,那么唯一的方法就是一个一个去试x。

比如:想得到一个以k个0开头的的哈希值(00…000xxx…xx),只能去一个一个尝试x来计算H(x)。

– 比特币中使用的哈希函数:

SHA-256
(Secure Hash Algorithm-256)

2. 数字签名

– 比特币中的账户管理:

日常生活中,开户的方法是带证件去银行办理即可,这是中心化的开户方法。比特币是通过去中心化的方法,每个用户开户不需要任何人的批准,他只要在本地生成一个公私钥对(public key, private key)即可。

公钥和私钥是非对称加密体系中的概念。非对称加密是为了解决对称加密中的密钥很难在不安全网络环境下分发而产生的。
公钥可以给任何人看,但私钥要保存好。这样一来在网络上A如果想给B发信息,只需要用B的公钥加密信息,B收到后用私钥解密即可,这样就解决了密钥分发不安全的问题。

在比特币中,

公钥相当于你的账户,别人给你转账,只需要你的账户即可。
私钥相当于你的密码,你要取钱或转给别人,那么就需要知道密码才行。

但在比特币系统中,是不需要加密的,公钥私钥对的用途在于数字签名。

比如,A转给B十个比特币,因为比特币是去中心化的,这条交易记录需要发布出去给其他人知道才行,于是A发布了这条交易记录,但是别人怎么才能确定的确是A发送了这条记录,而不是别人冒名顶替A把他的比特币转走了呢?这就需要A用自己的私钥对这条交易记录进行签名,然后其他人用A的公钥验证签名,这样就保证了A的身份是真实的。

– 比特币公钥和私钥对生成:

有一种攻击方法:

攻击者通过产生大量的公私钥对,然后用生成的公钥去对比区块链上已有的公钥,如果相同,就用对应的私钥来对交易进行签名,以到达窃取比特币的目的。

但实际上,这种攻击很难达成,因为公私钥对的生成是利用了哈希函数的,由于哈希函数的抗碰撞性,很难计算出一个与已存在公钥相同的公钥。但这个的前提是,有一个很好的随机源(a good source of randomness),如果随机源很差,那就有可能生成两个相同的公钥。

– 比特币中的数字签名:

比特币在数字签名时也要有一个很好的随机源(a good source of randomness),如果随机源不好的话,就有可能泄露私钥。

3. 比特币中的哈希函数和数字签名

比特币中通常是先对一个message进行哈希,然后再对这个哈希值进行数字签名。

http://www.lryc.cn/news/2241.html

相关文章:

  • PyTorch学习笔记:data.WeightedRandomSampler——数据权重概率采样
  • SpringMVC对请求参数的处理
  • 12年老外贸的经验分享
  • 电子电路中的各种接地(接地保护与GND)
  • php实现农历公历日期的相互转换
  • 基于SpringBoot的房屋租赁管理系统的设计与实现
  • 一文带你为PySide6编译MySQL插件驱动
  • 图论算法:树上倍增法解决LCA问题
  • Java线程池中submit() 和 execute()方法有什么区别
  • Vue.extend和VueComponent的关系源码解析
  • 【动态规划】01背包问题(滚动数组 + 手画图解)
  • javaEE 初阶 — 超时重传机制
  • 小米5x wlan无法打开解决
  • 负载均衡之最小活跃数算法
  • JavaScript 评测代码运行速度的几种方法
  • Linux 编译器 gcc/g++
  • 2.Java基础【Java面试第三季】
  • Java高级-多线程
  • mysql高级(事务、存储引擎、索引、锁、sql优化、MVCC)
  • Java后端开发功能模块思路
  • CAPL(vTESTStudio) - DoIP - TCP发送_05
  • 使用IntelliJ IDEA搭建datax-web开发环境
  • [SSD固态硬盘技术 14] GC垃圾回收太重要了
  • lamada表达式、stream、collect整理
  • Nacos 入门微服务项目实战
  • 【c++】类和对象:让你明白“面向一个对象有多重要”:构造函数,析构函数,拷贝构造函数的深入学习
  • 职场IT老手教你3步教你玩转可视化大屏设计,让领导眼前一亮!
  • 【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
  • 大数据Kylin(二):Kylin安装使用
  • 我们的微服务中为什么需要网关?