生成 HashCode 一致的字符串

package com.zl.map;import java.math.BigDecimal;
import java.util.Random;/*** “中间相遇法”是生日攻击的一种变形,它不比较Hash值,而是比较链中的中间变量。这种攻击主要适用于攻击具有分组链结构的Hash方案。* 中间相遇攻击的基本原理为* :将消息分成两部分,对伪造消息的第一部分从初试值开始逐步向中间阶段产生r1个变量;对伪造消息的第二部分从Hash结果开始逐步退回中间阶段产生r2个变量* 。在中间阶段有一个匹配的概率与生日攻击成功的概率一样。*/
public class HashCollide {/*** 拼凑字符的起始值(最后实际值可能为 collideCharBase +- mulBase)*/private int collideCharBase;/*** 中间变量*/private BigDecimal collideCharBase_decimal;/*** 中间变量*/private BigDecimal mulBase_decimal_pow;/*** 拼凑字符串长度*/private int collideCharLength;/*** hash算法中采用的乘积值 (hash' = hash * mulBase + char[i])*/private long mulBase;/*** 中间变量*/private BigDecimal mulBase_decimal;/*** 中间变量*/private long mulBase_desc;/*** 中间变量*/private BigDecimal mulBase_desc_decimal;/*** 2的轮回...*/private final long INT_ROUTE_NUMBER = 2l << 32;/*** 还是2的轮回...*/private final BigDecimal DECIMAL_ROUTE_NUMBER = new BigDecimal(INT_ROUTE_NUMBER);/*** 不知道干啥的,好奇怪*/private final Random random = new Random(System.nanoTime());/*** 测试你的char数组能吧srcHash变成什么样子** @param srcHash* @param collide* @return*/public int hashCodeTest(int srcHash, char collide[]) {int h = srcHash;int len = collide.length;for (int i = 0; i < len; i++) {h = (int) mulBase * h + collide[i];}return h;}/*** 根据这个类构造时设置的参数输出hash** @param srcString* @return*/public int hashCodeTest(String srcString) {char[] chars = srcString.toCharArray();int h = 0;int len = chars.length;for (int i = 0; i < len; i++) {h = (int) mulBase * h + chars[i];}return h;}/*** 将一个decimal的值通过取余转换成一个属于int范围的long** @param data* @return*/private long fixDecimal(BigDecimal data) {// 求余数BigDecimal sub = data.divideToIntegralValue(DECIMAL_ROUTE_NUMBER.multiply(DECIMAL_ROUTE_NUMBER));// 可能为负数,修正为long类型之后再次求余long val = data.subtract(sub).longValue();val += INT_ROUTE_NUMBER;val = val % INT_ROUTE_NUMBER;if (val < 0) // val应该不会小于0val += INT_ROUTE_NUMBER;return val;}/*** 把val转换为正序的char数组,用以表示一个n位k进制数据** @param val* @return*/private char[] offsetToArray(long val) {char[] stk = new char[collideCharLength];int pos = 0;while (val != 0) { // 进制转换,得到反序列stk[pos++] = (char) (val % (mulBase) + collideCharBase);val = val / mulBase;}int fillZero = collideCharLength - pos; // 补零的个数char[] collides = new char[collideCharLength];int i = 0;while (i < fillZero) { // 高位补零collides[i++] = (char) collideCharBase;}while (i < collideCharLength) { // 逐位反向输出collides[i] = stk[pos - i + fillZero - 1]; // pos - ( i - fillZero )++i;}return collides;}/*** 根据hash的src和target生成一组序列,使原串后面附加序列字符后的hash与target相同** @param src* @param target* @param collideCharBase* @param n* @return*/private char[] genCollisionArray(int src, int target) {long hx = mulBase_desc * src + collideCharBase;BigDecimal halfCal = mulBase_decimal_pow.multiply(new BigDecimal(hx)) // 中间变量.subtract(collideCharBase_decimal);BigDecimal left = halfCal.divide(mulBase_desc_decimal); // 依然是中间变量BigDecimal fix = new BigDecimal(target).subtract(left); // 还是中间变量,不过这次是修正数据long fixedDecimal = fixDecimal(fix);return offsetToArray(fixedDecimal);}/*** 构造函数** @param collideCharBase*            拼凑字符的起始值(最后实际值可能为 collideCharBase +- mulBase)* @param collideCharLength*            拼凑字符串长度* @param mulBase*            hash算法中采用的乘积值 (hash' = hash * mulBase + char[i])*/public HashCollide(int collideCharBase, int collideCharLength, int mulBase) {this.mulBase = mulBase;this.mulBase_decimal = new BigDecimal(mulBase);this.mulBase_desc = mulBase - 1;this.mulBase_desc_decimal = new BigDecimal(mulBase - 1);this.mulBase_decimal_pow = mulBase_decimal.pow(collideCharLength);this.collideCharBase = collideCharBase;this.collideCharBase_decimal = new BigDecimal(collideCharBase);this.collideCharLength = collideCharLength;}/*** ...** @param source* @param targetHash* @return*/public String collide(String source, int targetHash) {int hashSrc = source.hashCode();char[] collide = this.genCollisionArray(hashSrc, targetHash);return source.concat(new String(collide));}/*** ...** @return*/public String randomString(int length) {char[] chars = new char[length];for (int i = 0; i < length; ++i) {chars[i] = (char) (50 + random.nextInt(32 + 26 + 15));}return new String(chars);}public static void main(String[] args) {System.out.println("NH]n;<pFEP2R4DYDw4Fsg^Z[gTHIx=e4H:hSEVtfR^SqsP]y[gK_:gIgvZccbUmj".hashCode());System.out.println("W@3Lb=SIr`\\h?KT5?ayLtd37y]x=\\Pcibr4O4SaKubhJ_M`lqEbjk;5ycYmZp^cm".hashCode());System.out.println("====================");HashCollide collide = new HashCollide(85, 7, 31);for (int i = 0; i < 100; ++i) {String a = collide.randomString(12);    //控制长度String b = collide.collide(a, 123456);System.out.print(b);System.out.print("==");System.out.println(b.hashCode());if (b.hashCode() != 123456) {System.err.println("ERROR :: src = " + a);System.err.println("ERROR :: dst = " + b);System.exit(1);}}}
}

原文: https://my.oschina.net/backtract/blog/169310

生成 HashCode 一致的字符串相关推荐

  1. 这个VS Code扩展可以自动生成Python文档字符串

    机器之心报道 编辑:魔王 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现快速生成 Python 文档字符串的功能. Visual Studio Code(简称 VS Code) ...

  2. R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)、randomSequence函数创建不含重复项的随机序列数据集、创建随机字符串

    R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项).randomSequence函数创建不含重复项的随机序列数据集.创建随机字符串 ...

  3. 利用CodeBERT,这个VS Code扩展可以自动生成Python文档字符串

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现 ...

  4. python随机生成字符串_python生成随机数、随机字符串

    python生成随机数.随机字符串 import random import string # 随机整数: print random.randint(1,50) # 随机选取0到100间的偶数: pr ...

  5. mysql生成随机验证码_MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法...

    上一篇介绍了如何在 Oracle 生成随机数字.字符串.日期.验证码以及 UUID,今天我们继续讨论在 MySQL 中生成各种随机数据的方法.

  6. 026_使用eclipse生成hashCode和equals方法

    1. 使用eclipse生成hashCode方法, 模拟一个两个对象实例不同, hashCode形同, 两个对象的equals方法返回flase的场景. 1.1. People类 public cla ...

  7. python 随机字符串_python生成随机数、随机字符串

    python生成随机数.随机字符串 import random import string # 随机整数: print random.randint(1,50) # 随机选取0到100间的偶数: pr ...

  8. vscode python 自动补全_利用CodeBERT,这个VS Code扩展可以自动生成Python文档字符串...

    机器之心报道 编辑:魔王 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现快速生成 Python 文档字符串的功能. Visual Studio Code(简称 VS Code) ...

  9. Linux生成随机数字和字符串

    生成随机数字 使用系统的$RANDOM变量 > echo $RANDOM 14587 使用date +%s%N > date +%s%N 1529584024896587259 使用/de ...

最新文章

  1. Linux之Nginx
  2. 【计算理论】确定性有穷自动机 ( 自动机组成 | 自动机语言 | 自动机等价 )
  3. Eclipse设置条件断点
  4. 高斯混合模型 GMM
  5. microsoft store打不开,提示代码是: 0x80131500,怎么解决?
  6. elk中kibana中如何显示写入elasticsearch的数据
  7. EveryEeek English(9.21)
  8. 在三个Java IDE中生成的三种常见方法
  9. 水晶报表如何查看sql_有了这个报表工具,一键生成自定义的各种报表,还可以导出Excel...
  10. 网页里面的下拉框与数据库交互
  11. 诸多老牌数据仓库厂商当前,Snowflake如何创近12年最大IPO金额
  12. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十八):kafka0.10.1 内置性能测试API用法示例...
  13. 空值的日期类型和update 中的null
  14. 如何复制虚拟机中的数据到真实主机
  15. Android studio MacBook快捷键
  16. apicloud访问mysql_APICloud db组件
  17. Docker/Podman使用入门---从容器构建镜像 提交镜像到服务器UCloud dockerhub
  18. C/C++ opencv 计算 LBP特征 包括旋转不变 uniform 圆形邻域
  19. dhcp服务器设置(路由器dhcp服务器怎么设置)
  20. 召集令-3000人大集合

热门文章

  1. 利用Boot-Repair在三系统中修复ubuntu18
  2. REPAIR TABLE导致死锁
  3. 用CSS样式完成作业
  4. 微信视频号几点发布最好?看的人最多?
  5. 头条二面智力题!难受!
  6. 百度地图自定义图标icon 添加本地图片无法显示问题解决
  7. 转贴-- CISCO CPOS STM配置示例
  8. 物联网技术在智慧电网中的应用-Susie 周
  9. 【数据存储】从hashMap、mysql、redis、到分布式
  10. 出行即服务MAAS专辑(2022)(可下载)