I made a SHA256 hash bruteforcer as my first program in Rust. It's very specific to what I'm trying to bruteforce and I'll probably never find it.
I translated it from Python to make it faster, but can I make it even faster than this?
// Disable snake case warning
#![allow(non_snake_case)]
extern crate crypto;
extern crate rand;
use self::crypto::digest::Digest;
use self::crypto::sha2::Sha256;
use std::{i64, fs, process};
use std::time::Instant;
use rand::Rng;
fn main() {
// Local variables
let listWin = ["black","green","orange","orange","orange","black","black","orange","black","black","black","orange","black","black","orange","orange","green","black","orange","black","black","orange","orange","black","black","black","orange","black","black","orange","orange","orange","orange","black","orange","black","black","orange","orange","black","black","orange","green","black","orange","orange","orange","orange","green","black"];
let public_seed = "2132110516";
let round_ = 4645230;
let now = Instant::now();
let mut nbOfTry: u32 = 0;
let mut roundVerif = 0;
let mut predict;
loop {
let randomSeed = &CreateSeed(32);
predict = PredictColor(randomSeed, public_seed, round_);
// Check if the hash is correct by predicting the first 50 round of the day
while predict == listWin[roundVerif] {
roundVerif += 1;
predict = PredictColor(randomSeed, public_seed, round_ + roundVerif as u32);
if roundVerif > 45 {
fs::write("seed.txt", randomSeed).expect("Unable to write file");
process::exit(1);
}
}
roundVerif = 0;
nbOfTry += 1;
if nbOfTry % 1000000 == 0 {
println!("{}", nbOfTry);
println!("In {} secondes", now.elapsed().as_secs());
}
}
}
//---------------------------------------------------
// CreateSeed()
//---------------------------------------------------
// Description : Creates a random seed
//
// Input : Number of byte
// Output : Random seed with a len of 2*nbByte
//---------------------------------------------------
fn CreateSeed(nbByte: u8) -> (String){
let mut rng = rand::thread_rng();
let mut seed = String::new();
let mut byte: String;
for _x in 0..nbByte {
let rand = rng.gen::<u8>();
byte = format!("{:x}", rand);
if rand <= 15 {byte = format!("0{}", byte);}
seed = format!("{}{}", seed, byte);
}
return seed;
}
//---------------------------------------------------
// PredictColor()
//---------------------------------------------------
// Description : Predict the roll
//
// Input : server_seed : serveur seed
// public_seed : public seed
// round_ : First round of the day
// Output : --
//---------------------------------------------------
fn PredictColor(server_seed: &str, public_seed: &str, round_: u32) -> (String){
let toHash;
let mut hasher = Sha256::new();
// Hash everything
toHash = format!("{}-{}-{}",server_seed, public_seed, round_ );
hasher.input_str(&toHash[..]);
let hash_ = hasher.result_str();
// Get the roll number from the hash
let decNumber = i64::from_str_radix(&hash_[..8], 16);
let roll = decNumber.unwrap() % 15;
// Print the color
if roll == 0 {return "green".to_owned();}
else if roll >= 1 && roll <= 7 {return "orange".to_owned();}
else if roll >= 8 && roll <= 14 {return "black".to_owned();}
else{return "failed".to_owned();}
}