Skip to content

Instantly share code, notes, and snippets.

@segfo
Last active July 17, 2018 15:11
Show Gist options
  • Save segfo/c905228ab5b17159fbc1c3b1ed862a1f to your computer and use it in GitHub Desktop.
Save segfo/c905228ab5b17159fbc1c3b1ed862a1f to your computer and use it in GitHub Desktop.
extern crate crypto_hash;
extern crate ssdeep;
use crypto_hash::{Algorithm, hex_digest};
extern crate levenshtein;
use levenshtein::levenshtein;
fn main() {
// ハッシュ化対象の文字列
let hashes=&[b"give me hashsing!!",b"give you hashsing!",b"AAAAAAAAAAAAAAAAA!"];
// 記録用のベクタ
let mut hashed_strings=Vec::new();
let mut ssdeep_strings=Vec::new();
// 配列hashesの中身についていろいろとハッシュ化してみる
for hashme in hashes.iter(){
let hashme=*hashme;
[Algorithm::MD5,Algorithm::SHA1,Algorithm::SHA256].iter()
.map(|alg|(alg,hex_digest(alg.clone(), hashme)))
.for_each(|digest|{
println!("{:?}:{}",digest.0,digest.1);
hashed_strings.push(digest.1);
});
// ファジーハッシュを計算
let fuzzy_hash = ssdeep::hash(hashme).unwrap_or("fuzzy hashing failed.".to_owned());
println!("ssdeep:{}\n",fuzzy_hash);
ssdeep_strings.push(fuzzy_hash);
}
// 編集距離量をとってみる
for i in (0..3){
let lhs=&hashed_strings[i+0]; // left hand side(左辺)の略
let rhs=&hashed_strings[i+3]; // 上記より自明
println!("crypt hash is = {} <==> {} ==distance==> {}",lhs,rhs,levenshtein(&lhs,&rhs));
}
// ssdeepについても編集距離量を計算する
let lhs=&ssdeep_strings[0];
let rhs=&ssdeep_strings[1];
println!("ssdeep hash is = {} <==> {} ==distance==> {}",lhs,rhs,levenshtein(&lhs,&rhs));
let rhs = &ssdeep_strings[2];
// 差が出るであろう対象に対して左辺のみ変更して編集距離量を計算してみる
for i in (0..2){
let lhs=&ssdeep_strings[i];
println!("ssdeep hash is = {} <==> {} ==distance==> {}",lhs,rhs,levenshtein(lhs,rhs));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment