今天公布了两个bonus,好耶\(^o^)/~
1.课堂小测加分
2.回答问题加分
unbelievable!榜上有名了!
密码学简介
what is cryptography?
“密码学是研究如何在敌人存在的环境中通讯”
生活中的密码
六位的支付密码。
人脸识别:生物密码。
谍战剧中广泛使用:摩斯码。
密码学历史
古典密码学
某个古文明~1976
现代密码学
1976~今
对称加密和非对称加密
使用相同的密钥(比如摩斯码),进行加密和解密。针对大量数据。WHY?因为简单-复杂度低!
缺点
-
密钥管理问题:对称加密需要在加密和解密之间使用相同的密钥。这导致了密钥的分发和管理问题。安全地将密钥传输给受信任的接收方可能会面临风险,因为密钥泄露将导致数据容易被解密。
-
缺乏前向保密性:一旦密钥被泄露,攻击者可以轻松地解密以前和未来的加密数据。这就意味着对称加密无法提供前向保密性,即新数据的加密性不受已知密钥的泄露影响。
非对称加密,加密和解密的密钥不一样,针对少量数据。WHY?因为复杂度高,计算成本高。
零知识证明
证明自己有某样物品,但是不能让这个物品公之于众。
比如两个人都说自己知道一元三次的求根公式。
我的想法:给一个方程,自己知道结果。对是否能匹配结果。就像要验证一个黑盒。
老师的想法:互相出题,看谁做得对。
同态加密
想象你有一个密封的黑色盒子,里面放着一个数(如5)。你想在这个数上进行一些操作,比如加2,但你不想打开盒子。同态加密允许你在这个封闭的盒子上进行加法操作,并得到另一个密封的盒子,里面的数是7(5+2),而你完全不知道里面的具体数字是多少。
同态加密的核心价值在于:它允许我们对加密的数据进行计算,而无需首先解密它。这在很多领域都非常有用,尤其是在云计算中,用户可以将加密的数据发送到云服务器进行处理,而服务器在进行计算时无需解密数据,从而保护用户数据的隐私。
比特币使用的密码学
比特币只采用了哈希函数和数字签名。
-
哈希函数:
- 交易ID:当创建一个比特币交易时,该交易会被哈希,生成一个唯一的交易ID。
- 区块哈希:每个新的区块包含了前一个区块的哈希值,这确保了区块链的完整性和连续性。
- 工作证明(Proof of Work):比特币的共识机制是基于工作证明的,要求矿工解决一个数学难题,这实际上是一个哈希难题。矿工需要找到一个值,使得该区块内容的哈希值满足特定条件。
- Merkle树:交易在区块内部是以Merkle树的形式组织的,其根哈希存储在区块头中。这提供了一种高效验证单个交易是否包含在某个区块的方法。
-
数字签名:
- 交易验证:当一个用户希望发送比特币给另一个用户时,他会创建一个交易并使用其私钥签名。这个数字签名可以用来证明交易是由实际的币拥有者发起的,而且在传输过程中没有被篡改。
- 防止双重支付:数字签名确保了只有币的拥有者才能花费它,这帮助防止了双重支付和其他欺诈行为。
简单来说,哈希函数在比特币中主要用于确保数据的完整性和创建工作证明,而数字签名则用于验证比特币交易的合法性和完整性。
nonce值的用途
在比特币和许多其他区块链系统中,"nonce"(Number Only Used Once,只使用一次的数字)是一个至关重要的概念,特别是在工作证明(Proof of Work, PoW)的上下文中。nonce
为矿工提供了一种机制来证明他们已经完成了大量的计算工作,并成功地创建了一个新的区块。
在比特币挖矿中,nonce
的主要用途如下:
-
工作证明的组成部分:矿工的任务是找到一个特定的
nonce
值,使得当所有的区块数据(包括这个nonce
值)被哈希时,结果哈希值满足某个条件,例如前几位为零。为了达到这个目标,矿工会反复更改nonce
的值,并计算新的哈希值,直到找到一个满足条件的哈希值为止。 -
确保数据完整性:
nonce
和其他区块数据共同确保了数据的完整性。由于哈希函数对输入非常敏感,稍微改变一个字符(包括nonce
)都会导致完全不同的哈希输出。因此,通过调整nonce
的值,矿工可以产生不同的哈希结果,直到找到一个满足目标条件的哈希值。 -
证明计算工作量:工作证明机制确保网络的安全性,它要求矿工完成大量的计算工作。
nonce
为矿工提供了一种方法来尝试不同的解决方案,并证明他们已经投入了大量的计算资源来找到一个有效的解决方案。 -
增加随机性:由于
nonce
的值会被反复更改,它为区块的哈希计算提供了随机性。这意味着矿工不能预测哪个nonce
值会产生一个有效的哈希,因此他们必须尝试大量的可能的nonce
值。
缺点:浪费资源,一般的电脑算不了,只能买专用的矿机。炒高了显卡的成本。鉴于此,以太坊中已经把POW换成POS了。
哈希函数
哈希函数给文档产生一个“数字指纹”。
算法特点
正向快速
O(n)
输入敏感
明文变一点密文变很大
逆向困难
给定特定哈希值很难逆推出明文。挖矿就是给哈希值逆推,比如找到一个输入,前三十位都是0。
冲突避免(与碰撞阻力相同)
很难找到两段内容不同的明文使得他们哈希值相同
密码学安全
碰撞阻力
很难找到x!=y,但H(x)=H(y)。
找不到碰撞!=碰撞不存在。为什么?
我的想法:哈希函数的结果最多只有2^256(以SHA256为例),但是输入是无穷的。
老师的想法:就是我的想法!(*^▽^*)。
更透彻的鸽笼原理:10只鸽子放进9个鸽笼,必有一个鸽笼放两个鸽子。
隐秘性/不可逆性
如果输入x选自一个符合高阶最小熵的概率分布,在给定H(x)时来确定x是不可行的。
知道y也很难知道x。
x来自的集合如果熵很低,暴力试一遍就能知道原文了。
谜题友好
给定x时,就是只能在O(2^n)的复杂度找到y。
知道x也很难知道y。与隐蔽性相辅相成。
没有策略比暴力求解/随机求解好。
SHA256是安全的哈希函数,MD5已经是不安全的哈希函数了(因为已经不满足碰撞阻力了)。
比特币中没有账户,只有钱包
通过一对<pk,sk>非对称加密。
公钥和私钥的作用
私钥(可以对应为密码)签名,公钥(可以对应为账户)验证。
需要随机源产生公私钥。
私钥一旦丢失,无法找回。
数字签名
三个算法
生成公私钥(sk,pk):=generateKeys(keysize)
签名:sig:=sign(sk,msg)
验证:isVaild:=verify(pk,message,sig)
要求两个性质
有效的签名可以通过验证
签名不可伪造。
私钥不能被“试”出来。
实践中
要找到一个良好的随机源。
由于大小有限,所以用哈希算法。
比特币中公钥即身份。所以比特币中可以提供去中心化的管理。
具有匿名性:随时定制新的随机身份。方便洗钱啊!