密码学基础上篇
本文首发自虫洞社区,转载请注明出处。
密码学概念
密码学是对信息进行编码实现隐蔽信息的一门科学,采用密码技术可以隐藏和保护需要保密的信息,使未经授权者不能提取信息。需要隐藏的消息称为“明文”;明文被变换成的另一种隐蔽的形式就是“密文”。这种变换称为“加密”;加密的逆过程,即从密文恢复出对应的明文的过程称为“解密”。对明文进行加密时采用的一组规则(函数)称为“加密算法”。对密文解密时使用的算法称为“解密算法”。一般地,加密算法和解密算法都是在一组密钥控制之下进行的,加密时使用的密钥称之为“加密密钥”,解密时使用的密钥称之为“解密密钥”。
密码系统
什么是密码系统呢?密码系统是一个概念,可以用以下的等式简单概括:
- 密码系统 = 密码算法 + 明文空间 + 密文空间 + 密钥集合
把密码系统拆开来看,就容易理解,一个完整的密码系统,必定包含算法、秘钥、明文、密文四个部分。
密码系统应该满足的要求:
- 系统的保密性不依赖与算法的保密性,而依赖于密钥
- 破译加解密算法在计算上是不可行的(破译密文的代价超过被加密信息的价值;破译密文所花的时间操作信息有用期)
密码体制分类:
密码体制中根据加密秘秘钥是否相同,分为对称加密算法和非对称加密算法。顾名思义,非对称加密算法需要两个不同密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。反之使用同一秘钥的算法称为对称算法。
对称算法:加解密使用同一秘钥。
非对称算法:加解密使用不同的秘钥。
对称与非对称加密方式对比:
常见对称算法
由于对称算法加解密秘钥是相同的,所以对称算法的安全性依赖秘钥的长度,通常情况下秘钥越长,安全性越高。所以56bit的DES的安全性极低,极容易被暴力破解。而3DES是为了兼容DES的折中方案,目前比较安全的算法是AES。
常见非对称算法
说到非对称算法,一般都会先想到大名鼎鼎的RSA算法。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。RSA的公钥、私钥的组成,以及加密、解密的公式如下:
当然非对称算法还有椭圆曲线算法ECC,其主要安全性在于利用了椭圆曲线离散对数问题的困难性,证明过程还是挺繁琐,这边不细讲,有兴趣同学可以自己搜集资料了解下。
Hash函数
Hash函数定义
Hash算法又叫做杂凑算法、单项散列函数。散列函数就是把可变长度输入串(叫预映射)转化成固定长度的输出串(叫散列值)的一种函数。
Hash函数的要求:
- 任意消息大小都适用
- 输出固定的长度
- 计算相对简单:在有限时间和有限资源内能计算出 hash 值
- 抗第一原相性(单向性):给出一个输出z,找到满足h(x)=z的输入x是不可能的
- 抗第二原相性:给定x1和h(x1),找到满足h(x1)=h(x2)的x2在计算上是不可能的
- 抗冲突性满足h(x1)=h(x2)的一对,在计算上是不可行的
Hash函数算法特点:
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
生日攻击
生日问题:假设每个人的生日都是等概率的,每年365天,在k个中至少两个人的生日概率大于1/2,问k最小是多少?
P(至少两人生日相同)=1- P(k人生日都不同)
P(365, k) = 1- (1-1/365)(1-2/365)…(1-k/365)
p(365,23) = 0.5073
所以只要23个人,两个人相同生日的概率就大于50%了。根据生日悖论可以得到这样一个结论:对于hash值长度为2n的hash函数,生日攻击的复杂度是2n/2,注意这边攻击的是hash函数的抗第二原性。
王小云教授破解hash函数又是怎么回事。根据hash函数的特定我们知道,hash是不可能被破解的,这边说的破解说的是一个概念叫理论破解,指的是提出一个算法,使得可以用低于理论值得枚举次数找到碰撞。王小云的主要工作是给出了MD5,SHA-0的碰撞,以及SHA-1的理论破解,例如她证明了160位SHA-1,只需要大约2^69次计算就能找出来,而理论值是2^80次。所以王小云的贡献就是找到了比生日攻击复杂度低得多算法来快速找到一对强碰撞,弱碰撞依旧是不行的。
Hash函数的应用
hash函数常用在密码加密中,这样即使密码泄露也无法反向得到明文密码。但是可以事先得到一些字符的hash值,然后对比这个hash值得到明文密码,这就是常见的彩虹表破解。所以为了提高安全性,一些网站还会对密码加salt后再进行hash计算,这边所谓的salt就是几位随机字符串。接下来重点说下hash函数在区块链中的应用。哈希算法在区块链系统中的应用很广泛:比特币使用哈希算法通过公钥计算出钱包地址、区块头以及交易事务的哈希值,梅克尔树结构本身就是一颗哈希树,就连挖矿算法都是使用的哈希值难度匹配;以太坊中的挖矿计算也使用哈希算法,其中的梅克尔-帕特里夏树同样也是一颗哈希树。下面就举两例说明下hash在区块链中的重要性。
一:梅克尔树
在区块主体中,所有交易信息先进行两个一组的哈希计算,这种结构叫做梅克尔树(Merkle Tree),而且是一棵倒挂的树。例如一个区块里只有4笔交易,则默克尔树生成过程。
二:Hash挖矿
那hash在区块链中最为人知的应用是hash挖矿,那这到底是怎么一回事呢?例如比特币中的挖矿,简单来说,即要找出类似 00010000000000000000000000000000 的目标hash。后面挖矿越来越困难,就是因为要找到hash值越来越小。所以,可以简单理解为挖矿就是找出某随机数的hash使得比目标hash还要小。