Crypto入门-密码学杂谈 Diffie-Hellman密钥交换 在双方先前没有任何共同知识的情况下通过不安全信道协商出一个对称密钥。
DH密钥交换算法:双方选择一个和的一个生成元,在不安全的信道上发送。A选择一个秘密,计算并发送给B。B选择一个秘密,计算并发送给A。A与B可共同得出密钥。
当中间人截获信息但不能修改时,知道而不知道,计算很困难。
DH中间人攻击 当中间人可以截获并修改信息时。
中间人获取到和。现在A正要把发给B,此时中间人截获,自己选定一个随机数,将换成发给B。B把发给A时同理,选定随机数,将换成转发给A。
此时A计算出的密钥为,而B计算出的密钥为。此时中间人也可通过计算出,A向B发送加密消息时中间人拦截用解密,并用再次加密转发给B。
Hash长度扩展攻击 先了解基础知识:
以SHA-1举例,哈希函数拿到字符串后,将字节长度整除取余数,如果正好等于,则在字符串最后添上字节长度描述符。如果不等于,就先填充,填充的第一个字节为,其他字节均用,填充至余数为后同样增加个字节的长度描述符,这称为补位。
补位后,字符串每字节为一组进行分组,每次进行一次逻辑函数序列后产生一组新的值供下一次使用。当全部分组被处理完后,中的值作为最终结果。
一般选择形如的Hash函数,即在消息前固定一个密钥。但在MD型Hash算法(MD5、SHA-1等)的密钥长度已知、消息可控时易受到Hash长度扩展攻击。
具体攻击没看懂,挖坑待填。
例题:
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $secret ="XXXXXXXXXXXXXXX" ; $username ="admin" ; $password = $_POST ["password" ]; if ($COOKIE ["getmein" ] === md5 ($secret . urldecode ($username . $password ))){ echo "Congratulations! You are a registered user.\n" ; die ("The flag is " . $flag ); } else { die ("Your cookies don't match up! STOP HACKING THIS SITE." ); } ?>
将$secret
看成密钥,第一个“admin”当作密钥后半部分的可控制部分,这样一来密钥总长度为,数据为第二个“admin”。
数据随便篡改为“pcat”,使用工具HashPump:
1 2 3 4 5 # hashpump Input Signature: 571580b26c65f306376d4f64e53cb5c7 Input Data: admin Input Key Length: 20 Input Data to Add: pcat
得到结果:
1 2 3e67e8f0c05e1ad68020df30bbc505f5 admin\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00pcat
第一行塞Cookies的getmein中,第二行把“\x”改成“%”然后POST。
HashPump不好使,建议用pip安装hashpumpy,用法:
1 2 3 import hashpumpyresult=hashpumpy.hashpump('112bba932266ca5df55eb36dcd7050ec' ,'This_is_salt' ,'xx' ,28 ) print (result[0 ],result[1 ])
Shamir门限方案 一种秘密共享方案,将秘密信息分成份,只要有其中的份即可将秘密解出。
设需要份解出秘密消息,选择个随机数和大数,列出模多项式。随机选择个整数,代入上式得到个数。恢复秘密信息时只需要个对,利用拉格朗日插值法或矩阵乘法可求得秘密信息。
1 2 3 4 5 from secretsharing import PlaintextToHexSecretSharershares=PlaintextToHexSecretSharer.split_secret('abcdefg' ,3 ,5 ) res=PlaintextToHexSecretSharer.recover_secret(shares[0 :3 ])