-
Hash函数是不对称加密(输入的长度和密文长度不一样,输入任意长度根据不同的算法输出算法特定的长度) -
密码学层面一个好的hash函数要求没有比枚举法更加有效的攻击方法同时无法根据对应的hash值反推回加密的密文(单向性);也不能存在两个数据块具有相同的哈希值。所以哈希函数经常被用于判断是否篡改 -
针对于二,普遍存在的MD5并不是一个好的hash函数 查阅资料发现MD5加密时候对于一些特定的值会出现相同的hash值(对于这篇文章的数据,很不幸在我进行实地加密测试的时候发现MD5出现的值并不一样) -
消息认证:就是根据hash函数的不可伪造性来实现的,当消息发出时发送者会生成一个hash值,接收者收到文件后将文件进行hash看是否和发送的hash值一致,一致就是没有被篡改。然而如果遇到了中间人把文件和hash值一起改了,这样就不能保证文件传输的正确性。这里给出了几个可行性方案:1.用一种对称密码算法,加密信息和hash值,这样被截获了,中间人也无法获取信息和hash值,也就不能篡改了,发送者和接收者才有可以解密的密钥 2.在1的基础上其实只要加密hash值就可以了,然后进行验证文件完整性就可。3.信息通信双方共同约定一个秘密值S,将文件和S一起hash从而获得hash这样文件哪怕更改了,也可以发现问题。4.考虑到3方案的隐私性,将文件和hash进行加密后再发送 -
MAC信息认证码:再hash时候加上一个密钥,密钥只有通信双方知道,这样就可以知道是否发生了篡改 -
HASH函数还可以用于数字签名,大致含义就是数字签名时候用了用户的私钥来进行产生信息的hash值,如果要进行篡改这个私钥就要获取,这是十分困难的 -
HASH函数的加密方法理解: 1.将需要加密的密文转化为二进制,如果需要转化为128位(举例),就按照128位一次进行切片 2.进行切片后比如存在3组半,根据不同的算法会补齐(不同算法补的不一样),最后是4组 3.从第一组的每一位与第二组的每一位进行异或运算(不用为1 相同为0),然后得出的结果继续与第三组异或 循环往复直到最后 4.最初的设想到这里就结束了,但是很快就会发现一个问题,普遍的很多数据的前几位都是0或者说都是固定数(比如很多文件有文件头,这些都是固定的),这样进行异或会有一定的规律性,所以每一次两组的异或需要进行一次移位 5.同时还要考虑到一个点,如果固定输出的位数很小比如每一个加密后都是4位长度的hash值,那么最多能表示2的4次方个数字能表示的太少了,同时肯定会有很多的碰撞产生(两个不同的消息产生了相同的hash值) -
9.枚举攻击:针对于hash函数的攻击主要有两种一种是枚举,一种是原理分析,这里首先讲解枚举(顾名思义,一个个试过去),平均来说只要尝试一半的可能就能得到需要找到的Y符合Y经过加密后为密文。如果hash加密的过程中使用了密钥(加密了hash值 并且贴在最后 只要破解密钥就可以破解所有了,因为密钥知道了,就可以实现篡改,连同前面的hash和后面的加密文一起改),就可以采用枚举攻击下的一种形式:碰撞攻击: 在了解碰撞攻击之前,首先了解一下生日悖论:大致意思就是如果有2个人不能那么就是1/365 如果是3人不能同一天生日就是364/365 * 363/365 这里举例为三个人,那么就是一个人随便取,第二个人只有365分支364的几率,第三个人只有365分支363的几率,因为那几个被人取走了,这个应该是概率论与数理统计的知识 根据这里我们可以得到如果要在23个人当中找到没有相同生日的概率是约等于百分之50 在100个人中找没有相同生日的概率约为百分之0 将这个用于碰撞,如果要找两个相同的生日(如果是密码学上的相同的机密后的密文,只要找根号下N次,N是所有的次数)ps:这里有点晕,给一个总结性的结论,枚举时候,就是一个个遍历,要找2/n 次,在概率上是刚好找到,但是在碰撞的时候,一对一对的找,就是两个一起找,那么只要根号下N的次数就可以了。证明就是上面的生日悖论 接下来开始讲解碰撞攻击,碰撞攻击是 大致意思就是先对A发送的文字进行获取,因为是明文发送的(发送者认为私钥不会泄露,所以不会被篡改),中间人获取到了A的明文,然后对A进行合法的改造类似于(添加空格 回车之类的)不改变意思但是改变其内容。产生2的m/2次方 种,为什么要m/2次在之前的讲解就说过,只要2的m/2次方种的组合理论上就可以找到了,理论上那么多的就不需要了 -
密码分析:利用算法的某种特性,而不是用枚举来进行破译。没有什么现实中实际攻破的案例,这里就一带而过 -
SHA512的计算:以加密abc为例: 1.
如上图所示:abc的二进制为0110 0001 0110 0010 0110 0011 要补齐到896位,所以要(896-24=872)872位的数字,第一位为0,后871为0 也就是0110 0001 0110 0010 0110 0011 1000 (省略868个0) 2. 如上图所示,需要在最后加入表示其长度的附加长度(全0+0001 1000)括号内一共128位,同时衍生出SHA512最多的输入长度是((2的128次方)-1)所以在经过1 2 两个步骤后输入的内容分割成16块如下图所示(16进制 一位=4位二进制): 3. 如图没有多的需要讲的 4.
Wt就是经过信息扩展算法得到的具体算法如下: W1-16就是等于M的1-16 (M是1024按照每个64位切了16块产生的) W16-79就是有一定的算法
Kt这里取前80个素数的立方根的前64位
经过上面的计算第一次的abcdefgh的结果是: 循环80次的结果就是: 最后执行a(a为最初的值6a09e667f3bcc908)+73a54f399fa4b1b2 = ddaf35a193617aba binggo对上了。
|