IGA/collision_test1.ts
2025-05-17 17:42:34 +02:00

93 lines
No EOL
3 KiB
TypeScript

import IGA from './IGA';
import fs from 'fs';
type Collision = {
hash: string,
old: string,
new: string,
randomPadding: boolean
}
function sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
const len = 4
let state = ["a"]
const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let seen = {}
let counter = 0
let collisions: Collision[] = []
const startTime = Date.now()
async function bruteForce(pos) {
while (true) {
if (pos != state.length - 1) {
await bruteForce(pos + 1)
}
if (pos == state.length - 1) {
let hash1 = IGA.hash(state.join(""))
let hash2 = IGA.hash(state.join(""), 0, 32, 32768)
if (seen[hash1] != undefined) {
collisions.push({
hash: hash1,
old: seen[hash1],
new: state.join(""),
randomPadding: true
})
} else {
seen[hash1] = state.join("")
}
if (seen[hash2] != undefined) {
if (!hash1.startsWith("8000")) {
collisions.push({
hash: hash2,
old: seen[hash2],
new: state.join(""),
randomPadding: false
})
}
} else {
seen[hash2] = state.join("")
}
if (counter % 1000 == 0) {
let timeTook = Math.floor((Date.now() - startTime) / 100)/10
let etaPart = 0
for (let ln = 1; ln <= len; ln++) {
etaPart += Math.pow(alphabet.length, ln)
}
let eta = Math.max(0, Math.floor((etaPart - counter) * (timeTook / counter) * 10) / 10)
console.log("Current state: " + state.join("") + ", Last hash: " + hash1 + ", Collisions: " + collisions.length + ", Time: " + timeTook + "s, ETA: " + eta + "s");
await sleep(1)
}
if (counter % 10000 == 0) {
fs.writeFileSync("collisions.json", JSON.stringify(collisions))
}
counter++
}
let currentChar = alphabet.indexOf(state[pos])
if (currentChar == alphabet.length - 1) {
for (let i = pos; i < state.length; i++) {
state[i] = "a"
}
break
}
state[pos] = alphabet[currentChar + 1]
}
if (pos == 0 && state.length < len) {
for (let i = 0; i < state.length; i++) {
state[i] = "a"
}
state.push("a")
await bruteForce(0)
}
}
async function main() {
await bruteForce(0)
let tT = Math.floor((Date.now() - startTime) / 100)/10
console.log("Done! Took " + tT + "s, Checked " + counter + " hashes, Collisions: " + collisions.length);
console.log(collisions);
fs.writeFileSync("collisions.json", JSON.stringify(collisions))
}
main()