Я пытался реализовать алгоритм HashCash в Go!Для тех из вас, кто не знает -
HashCash - это способ остановить спам.По сути, заголовок состоит из некоторых переменных среды, известных как клиенту, так и серверу (электронная почта, отметка времени и т. Д.).Случайный одноразовый номер добавляется в конец заголовка.Клиент пытается перехватить частичное столкновение хеша (например, где первые x биты равны 0), изменяя одноразовый номер.
HashCash работает, потому что не так дорого найти частичные коллизии хешей.Когда сервер получает этот заголовок, он проверяет информацию в нем (так что он может использоваться только для одного сеанса) и вычисляет результирующий хэш.Если первые x биты равны 0, то на компьютере клиента было потрачено значительное количество времени, чтобы вычислить коллизию (которая не произошла бы на спамботе)
Для меня я просто хочу написать программу, которая находит время, которое требуется клиенту, чтобы найти частичное столкновение хеша x бит.
Я написал этот код, который будет возвращать true / false, если int64 имеет хеш-коллизию x бит.
func partialAllZeroes (zeroCount uint8, val int64) (bool, os.Error) {
setBitString := "1111111111111111111111111111111111111111111111111111111111111111"
unsetBitString := "0000000000000000000000000000000000000000000000000000000000000000"
setBitString = setBitString[0:zeroCount-1]
unsetBitString = unsetBitString[0:zeroCount-1]
zeroTest, e := strconv.Btoi64(setBitString, 2) // 64 0bits
zeroes, e := strconv.Btoi64(unsetBitString, 2) // 64 1bits
if e != nil {
return false, e
}
result := val & zeroTest
switch {
case result == zeroes:
return true, nil
case result != zeroes:
return false, nil
}
return false, os.NewError("")
}
Мой текущийПроблема в том, что у меня много проблем с преобразованием типов.Например, я могу работать только с типом int64 , потому что это то, что возвращает strconv.Btoi64 .Другая проблема, на которую я также обращаю внимание, заключается в том, что хеш-функция возвращается в виде байтового массива, и я понятия не имею, как преобразовать ее в int64 .
Ниже мой текущий хэш-код -
hasher := sha1.New()
baseCollisionString := "BASE COLLISION STRING"
nonce := "12345"
hasher.Write([]byte(strings.Join(baseCollisionString, nonce)))
testCollision := hasher.Sum()
// Somehow I must convert the first x bits of testCollision into an int64 type, so I can use partialAllZeroes with it