/// <summary> /// recover key from many different reader responses on same tag challenge /// </summary> /// <param name="uid"></param> /// <param name="nt"></param> /// <param name="nonces"></param> /// <returns></returns> public static ulong MfKey32(uint uid, uint nt, IEnumerable <Nonce> nonces) { var nonce = nonces.First(); nonces = nonces.Skip(1); var p64 = Crypto1.PrngSuccessor(nt, 64); var list = Crapto1.LfsrRecovery32(nonce.Ar ^ p64, 0); var keys = new ConcurrentBag <ulong>(); Parallel.ForEach(list, s => { var crapto1 = new Crapto1(s); crapto1.LfsrRollbackWord(); crapto1.LfsrRollbackWord(nonce.Nr, true); crapto1.LfsrRollbackWord(uid ^ nt); var crypto1 = new Crypto1(); var allPass = nonces.All(n => { crypto1.State = crapto1.State; crypto1.Crypto1Word(uid ^ nt); crypto1.Crypto1Word(n.Nr, true); return(n.Ar == (crypto1.Crypto1Word() ^ p64)); }); if (allPass) { keys.Add(crapto1.Lfsr); } }); return(keys.Count == 1 ? keys.First() : ulong.MaxValue); }