密码学系列之:加密货币中的scrypt算法
文章目录
- 简介
- scrypt算法
- scrypt算法详解
- scrypt的使用
简介
为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合。但是这些算法逐渐被一些特制的ASIC处理器打败,这些ASIC处理器不做别的,就是专门来破解你的密码或者进行hash运算。
最有名的当然是比特币了,它使用的是为人诟病的POW算法,谁的算力高,谁就可以挖矿,这样就导致了大量无意义的矿机的产生,这些矿机什么都不能干,就算是用来算hash值。结果浪费了大量的电力。
普通人更是别想加入这个只有巨头才能拥有的赛道,如果你想用一个普通的PC机来挖矿,那么我估计你挖到矿的几率可能跟被陨石砸中差不多。
为了抵御这种CPU为主的密码加密方式,科学家们发明了很多其他的算法,比如需要占用大量内存的算法,因为内存不像CPU可以疯狂提速,所以限制了很多暴力破解的场景,今天要将的scrypt算法就是其中一种,该算法被应用到很多新的加密货币挖矿体系中,用以表示他们挖矿程序的公平性。
scrypt算法
scrypt是一种密码衍生算法,它是由Colin Percival创建的。使用scrypt算法来生成衍生key,需要用到大量的内存。scrypt算法在2016年作为RFC 7914标准发布。
密码衍生算法主要作用就是根据初始化的主密码来生成系列的衍生密码。这种算法主要是为了抵御暴力破解的攻击。通过增加密码生成的复杂度,同时也增加了暴力破解的难度。
但是和上面提到的原因一样,之前的password-based KDF,比如PBKDF2虽然提高了密码生成的遍历次数,但是它使用了很少的内存空间。所以很容易被简单的ASIC机器破解。scrypt算法就是为了解决这样的问题出现的。
scrypt算法详解
scrypt算法会生成非常大的伪随机数序列,这个随机数序列会被用在后续的key生成过程中,所以一般来说需要一个RAM来进行存储。这就是scrypt算法需要大内存的原因。
接下我们详细分析一下scrypt算法,标准的Scrypt算法需要输入8个参数,如下所示:
- Passphrase: 要被hash的输入密码
- Salt: 对密码保护的盐,防止彩虹表攻击
- CostFactor (N): CPU/memory cost 参数,必须是2的指数(比如: 1024)
- BlockSizeFactor ®: blocksize 参数
- ParallelizationFactor §: 并行参数
- DesiredKeyLen (dkLen): 输出的衍生的key的长度
- hLen: hash函数的输出长度
- MFlen: Mix函数的输出长度
这个函数的输出就是DerivedKey。
首先我们需要生成一个expensiveSalt。首先得到blockSize:
blockSize = 128*BlockSizeFactor
然后使用PBKDF2生成p个blockSize,将这p个block组合成一个数组:
[B0...Bp−1] = PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor)
使用ROMix对得到的block进行混合:
for i ← 0 to p-1 doBi ← ROMix(Bi, CostFactor)
将B组合成新的expensiveSalt:
expensiveSalt ← B0∥B1∥B2∥ ... ∥Bp-1
接下来使用PBKDF2和新的salt生成最终的衍生key:
return PBKDF2HMAC-SHA256(Passphrase, expensiveSalt, 1, DesiredKeyLen);
下面是ROMix函数的伪代码:
Function ROMix(Block, Iterations)Create Iterations copies of XX ← Blockfor i ← 0 to Iterations−1 doVi ← XX ← BlockMix(X)for i ← 0 to Iterations−1 doj ← Integerify(X) mod Iterations X ← BlockMix(X xor Vj)return X
其中BlockMix的伪代码如下:
Function BlockMix(B):The block B is r 128-byte chunks (which is equivalent of 2r 64-byte chunks)r ← Length(B) / 128;Treat B as an array of 2r 64-byte chunks[B0...B2r-1] ← BX ← B2r−1for i ← 0 to 2r−1 doX ← Salsa20/8(X xor Bi) // Salsa20/8 hashes from 64-bytes to 64-bytesYi ← Xreturn ← Y0∥Y2∥...∥Y2r−2 ∥ Y1∥Y3∥...∥Y2r−1
scrypt的使用
Scrypt被用在很多新的POW的虚拟货币中,比如Tenebrix、 Litecoin 和 Dogecoin。感兴趣的朋友可以关注一下。
本文已收录于 http://www.flydean.com/42-scrypt/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
密码学系列之:加密货币中的scrypt算法相关推荐
- 什么是加密货币中的 FOMO?我们该如何应对 FOMO?
FOMO 是一个相对较新的术语,可以强烈影响我们的决策.虽然 FOMO 可能是一种强大的情绪,但重要的是要记住它通常基于非理性思维. 什么是FOMO? FOMO 代表"害怕错过". ...
- 计算机视觉系列-轻松掌握 MMDetection 中 全景分割算法 MaskFormer(一)
计算机视觉系列-轻松掌握 MMDetection 中 全景分割算法 MaskFormer(一) 目录 全景分割 简介 MaskFormer 简介 MaskFormer 配置代码 计算机视觉学习笔记系列 ...
- Vitalik Buterin:反对基尼系数在加密货币中的过度使用
本文作者:以太坊创始人VitalikButerin 特别感谢BarnabeMonnot和Tinazhen提供反馈和审查. 基尼系数(也称为基尼指数)是迄今为止最受欢迎和广为人知的不平等不等式衡量标准, ...
- 加密货币与智能合约的隐私 (二): 混音器和ring签名
在本系列的第二部分中,我将重点介绍金融隐私,包括"混音器"和铃声签名. 这些主题中的每一个都可以保证他们自己的完整帖子,所以我会坚持每个主题的高级功能,而不是太深. 如果你现在想在 ...
- MIT开发新加密货币,用户所需数据比比特币减少99%
MIT的研究人员开发了一种新的加密货币,大大减少了用户加入网络和验证交易所需的数据,与当今流行的加密货币相比,最高可达99%.这意味着网络更具扩展性. 像比特币之类流行的加密货币都是构建于区块链上的网 ...
- 2021年去中心化金融平台22亿美元加密货币被盗
Chainalysis最新报告显示,2021年去中心化金融(DeFi)平台被盗加密货币金额暴增1330%. 区块链数据平台Chainalysis最近发布加密货币犯罪趋势报告,发现2021年有价值140 ...
- 比特币耶稣Roger Ver:BCH是世界上最创新、最实用的加密货币之一
近日,天使投资人.比特币耶稣Roger Ver再度表示:"比特币现金(BCH)正在证明自己是世界上最创新.最有用的加密货币之一." BCH的创新,源于其不断对新技术的探求,不断扩容 ...
- 加密货币是货币,而非股权
Naval最近引发了一场辩论,主题围绕开发人员激励制度与持币者价值,它激发了许多回应且讨论成果丰硕.这个话题早已不再新鲜,下面我会针对加密货币领域出现的问题直抒己见. 两个问题摆在眼前: (1)持有者 ...
- 为什么加密货币投资者正在放弃他们的美国公民身份
点击上方 "蓝色字" 可关注我们! 暴走时评: Andrew Henderson是Nomad Capitalist的创始人,该公司帮助来自世界各地的人们搬到不同的国家,同时尽量减少 ...
最新文章
- Ubuntu 系统如何修改主机名
- 浪潮POWER 9:英特尔的挑战者
- Python的 is 和 == 弄懂了吗?
- mysql5.6.33安装教程_Linux下mysql5.6.33安装配置教程
- 软件_搭建rtsp视频推送环境
- 构建一个完整的中文智能问答系统
- JavaScript—从数组的indexOf方法深入——Object的Property机制。
- 图书管理系统sql语句
- 微信小程序商城毕业设计毕设作品(8)毕业设计论文
- 两个列向量相乘怎么计算_两个矩阵相乘怎么算?
- CAD等分不显示等分点
- 【机器学习】【决策树】C4.5算法,详解+python代码实现
- 网页前端设计之多选按钮
- Bootstrap4表单验证(纯JavaScript方法)
- iOS10兼容,最新特性。
- Pandas中的appy和applymap
- 虚拟主机如何清空网站程序文件和mysql数据库数据
- 十款免费开源音频制作软件
- C++ Vjudge 训练题
- 用Java写一个解一元二次方程的程序