예제 #1
0
        public static string Attack(byte[] bytes)
        {
            var show_all = "";

            if (!bytes.Any())
            {
                return(show_all);
            }


            // Decrypt data,  with key 123321,  length 208
            DecryptData(bytes, 123321, 208);

            // validate CRC is ok.  (length 210,  since two last bytes is crc)
            if (!Crc.CheckCrc14443(Crc.CRC16_14443_A, bytes, 210))
            {
                return(show_all);
            }


            var myKeys = new List <MyKey>();

            // Copy nonce - data into object and list
            for (int i = 0; i < 12; i++)
            {
                var mykey = new MyKey();
                mykey.UID     = ToUInt32(bytes, 0);
                mykey.KeyType = bytes[(i + 1) * 16];
                mykey.Sector  = bytes[(i + 1) * 16 + 1];

                mykey.nt0 = ToUInt32(bytes, (i + 1) * 16 + 4);
                mykey.nr0 = ToUInt32(bytes, (i + 1) * 16 + 8);
                mykey.ar0 = ToUInt32(bytes, (i + 1) * 16 + 12);

                // skip sectors with 0xFF
                if (mykey.Sector != 0xFF)
                {
                    myKeys.Add(mykey);
                }
            }


            var my_cmp = new KeyComparer();

            myKeys.Sort(my_cmp);

            show_all = KeyWorker(myKeys);
            return(show_all);
        }
예제 #2
0
        public static string Attack(byte[] bytes)
        {
            var show_all = "";

            if (bytes == null || !bytes.Any())
            {
                return($"No data found on device{Environment.NewLine}");
            }


            // Decrypt data,  with key 123321,  length 208
            DecryptData(bytes, 123321, 208);

            // validate CRC is ok.  (length 210,  since two last bytes is crc)
            if (!Crc.CheckCrc14443(Crc.CRC16_14443_A, bytes, 210))
            {
                return($"Data failed CRC check{Environment.NewLine}");
            }

            /*
             * Data layout
             * first 16byte is Sector0, Block0
             *
             * then comes items of 16bytes length
             *   0           auth cmd  (0x60 or 0x61)
             *  1           blocknumber  (0 - 0x7F)
             *  2,3         crc 2bytes
             *  4,5,6,7     NT
             *  8,9,10,11   NR
             *  12,13,14,15 AR
             */

            var uid = ToUInt32(bytes, 0);

            var myKeys = new List <MyKey>();

            // Copy nonce - data into object and list
            for (int i = 0; i < 12; i++)
            {
                var mykey = new MyKey
                {
                    UID     = uid,
                    KeyType = bytes[(i + 1) * 16],
                    Block   = bytes[(i + 1) * 16 + 1],
                    nt0     = ToUInt32(bytes, (i + 1) * 16 + 4),
                    nr0     = ToUInt32(bytes, (i + 1) * 16 + 8),
                    ar0     = ToUInt32(bytes, (i + 1) * 16 + 12)
                };
                mykey.Sector = ToSector(mykey.Block);

                // skip sectors with 0xFF
                if (mykey.Sector != 0xFF)
                {
                    myKeys.Add(mykey);
                }
            }


            var my_cmp = new KeyComparer();

            myKeys.Sort(my_cmp);

            show_all = KeyWorker(myKeys);
            return(show_all);
        }