import std.array : join; import tagion.crypto.SecureNet : StdHashNet; auto selected_questions = indexed(standard_questions, [0, 2, 3, 7, 8]).array.idup; string[] answers = [ "mobidick", "Mother Teresa!", "Pluto", "Pizza", "Maputo" ]; const net = new StdHashNet; auto recover = KeyRecover(net); recover.createKey(selected_questions, answers, 3); auto R = new ubyte[net.hashSize]; { // All the ansers are correct const result = recover.findSecret(R, selected_questions, answers); assert(R.length == net.hashSize); assert(result); // Password found } { // 3 out of 5 answers are correct. This is a valid answer to generate the secret key string[] good_answers = [ "MobiDick", "MOTHER TERESA", "Fido", "pizza", "Maputo" ]; auto goodR = new ubyte[net.hashSize]; const result = recover.findSecret(goodR, selected_questions, good_answers); assert(R.length == net.hashSize); assert(result); // Password found assert(R == goodR); } { // 2 out of 5 answers are correct. This is NOT a valid answer to generate the secret key string[] bad_answers = [ "mobidick", "Monalisa", "Fido", "Burger", "Maputo" ]; auto badR = new ubyte[net.hashSize]; const result = recover.findSecret(badR, selected_questions, bad_answers); assert(!result); // Password not found assert(R != badR); }