예제 #1
0
        public void Crypto1State(ulong key, uint odd, uint even)
        {
            var crypto1 = new Crypto1(key);

            Assert.AreEqual(odd, crypto1.State.Odd);
            Assert.AreEqual(even, crypto1.State.Even);
        }
예제 #2
0
        static void WriteBlock(Crypto1 crapto1, byte b, byte[] blockData)
        {
            var enWrite = new byte[4] {
                0xA0, b, 0, 0
            };

            Iso14443aCrcAppend(enWrite, 2);
            var enWriteParity = new byte[4];

            crapto1.Encrypt(enWrite, enWriteParity, 0, 4);
            var resbits = device.InitiatorTransceiveBits(enWrite, 32, enWriteParity, abtRx, MAX_FRAME_LEN, null);
            var res     = 0;

            for (int i = 0; i < 4; i++)
            {
                res |= ((abtRx[0] >> i) ^ crapto1.Crypto1Bit()) << i;
            }
            WriteLine("Write Cmd : " + res.ToString("x2"));
            if (res != 0x0A && res != 0x0E) // 0x0A ACK, 0x0E NAK
            {
                throw new Exception("Cmd Error: " + res.ToString("x2"));
            }

            var enBlock       = new byte[18]; // 16byte data + 2byte crc
            var enBlockParity = new byte[18];

            if (blockData != null)
            {
                Array.Copy(blockData, enBlock, blockData.Length > 16 ? 16 : blockData.Length);
            }
            Iso14443aCrcAppend(enBlock, 16);
            Write("Write Block{0,2}: ", b);
            PrintHex(enBlock, 16);
            crapto1.Encrypt(enBlock, enBlockParity, 0, 18);
            resbits = device.InitiatorTransceiveBits(enBlock, 144, enBlockParity, abtRx, MAX_FRAME_LEN, null);
            res     = 0;
            for (int i = 0; i < 4; i++)
            {
                res |= ((abtRx[0] >> i) ^ crapto1.Crypto1Bit()) << i;
            }
            WriteLine("Write data: " + res.ToString("x2"));
            if (res != 0x0A && res != 0x0E) // 0x0A ACK, 0x0E NAK
            {
                throw new Exception("Cmd Error: " + res.ToString("x2"));
            }

            //var enTransfer = new byte[4] { 0xB0, b, 0, 0 };
            //Nfc.Iso14443aCrcAppend(enTransfer, 2);
            //var enTransferParity = new byte[4];
            //crapto1.Encrypt(enTransfer, enTransferParity, 0, 4);
            //res = device.InitiatorTransceiveBits(enTransfer, 32, enTransferParity, abtRx, MAX_FRAME_LEN, null);
        }
예제 #3
0
 public void EvenParity8()
 {
     for (int i = 0; i <= 0xff; i++)
     {
         var count = 0;
         var v     = i;
         while (v > 0)
         {
             count += v & 1;
             v    >>= 1;
         }
         Assert.AreEqual((byte)(count % 2), Crypto1.EvenParity8((byte)i));
     }
 }
예제 #4
0
        private void BtnGonderClient_Click(object sender, EventArgs e)
        {
            if (cbChoose.SelectedIndex == 1)
            {
                Crypto1 crypto1 = new Crypto1();
                //string key = "asdfgytasdfgytrfghtuytorfghtuyto";

                byte[] acikMetin    = File.ReadAllBytes(m_ImageFilePath);
                byte[] sifreliMetin = crypto1.EncryptToByteArray(acikMetin, simetricKey);

                serverWriter.WriteLine(/*"UPLOAD_START_" +*/ Convert.ToBase64String(sifreliMetin) /*+ "_UPLOAD_END"*/);
                serverWriter.Flush();

                lstMesajlarClient.Items.Add("Dosya yolu : " + m_ImageFilePath + " gönderildi.");
                LogWriter("Dosya yolu : " + m_ImageFilePath + " gönderildi.");
            }
            else if (cbChoose.SelectedIndex == 2)
            {
                Crypto2 crypto2 = new Crypto2();

                string enryptoText = crypto2.EncryptKey(txtMesajClient.Text, simetricKey);
                enryptoText += ComputeSha256Hash(enryptoText);

                serverWriter.WriteLine(enryptoText);
                serverWriter.Flush();
                //CLIENT'IN KENDI LISTBOX'INA EKLEME ISLEMI
                lstMesajlarClient.Items.Add(txtNick.Text + ": " + txtMesajClient.Text);
                LogWriter(txtNick.Text + ": " + txtMesajClient.Text);
            }
            else if (cbChoose.SelectedIndex == 3)
            {
                Crypto3 crypto3 = new Crypto3();
                serverWriter.WriteLine(crypto3.Encrypto(txtMesajClient.Text));
                serverWriter.Flush();
                //CLIENT'IN KENDI LISTBOX'INA EKLEME ISLEMI
                lstMesajlarClient.Items.Add(txtNick.Text + ": " + txtMesajClient.Text);
                LogWriter(txtNick.Text + ": " + txtMesajClient.Text);
            }
            else
            {
                serverWriter.WriteLine(txtMesajClient.Text);
                serverWriter.Flush();
                lstMesajlarClient.Items.Add(txtNick.Text + ": " + txtMesajClient.Text);
                LogWriter(txtNick.Text + ": " + txtMesajClient.Text);
            }
            txtMesajClient.Clear();
        }
예제 #5
0
        public static int FilterFunctionTest()
        {
            var s = new byte[]
            {
                0x00,
                0x80,
                0x20,
                0xA0,
                0x08,
                0x88,
                0x28,
                0xA8,
                0x02,
                0x82,
                0x22,
                0xA2,
                0x0A,
                0x8A,
                0x2A,
                0xAA
            };
            ulong key = 0;

            for (int i = 0; i < 5; i++)
            {
                key = key << 8 | (byte)rnd.Next(0xFF);
            }
            key <<= 8;
            Console.WriteLine("0x{0:x10}", key);
            for (int i = s.Length - 1; i >= 0; i--)
            {
                Console.Write("{0:x2} ", s[i]);
            }
            Console.WriteLine();
            int fb = 0;

            for (int i = s.Length - 1; i >= 0; i--)
            {
                var c  = new Crypto1(key | (ulong)s[i]);
                var ks = c.PeekCrypto1Bit();
                fb = fb << 1 | ks;
                Console.Write(" {0} ", ks);
            }
            Console.WriteLine();
            Console.WriteLine("0x{0:x4}", fb);
            return(fb);
        }
예제 #6
0
        public void Authentication(byte sector, KeyType keyType, ulong key)
        {
            var auth = new byte[4]
            {
                keyType == KeyType.KeyA ? (byte)0x60 : (byte)0x61,
                (byte)(sector * 4), 0, 0
            };

            Iso14443aCrcAppend(auth, 2);
            var nt      = 0u;
            var crapto1 = new Crypto1(key);

            if (Crypto1 == null) // 初次驗證
            {
                Device.DeviceSetPropertyBool(NfcProperty.HandleParity, true);
                Device.InitiatorTransceiveBytes(auth, 4, rxBuffer, MAX_FRAME_LEN, 0);
                Device.DeviceSetPropertyBool(NfcProperty.HandleParity, false);
                nt = rxBuffer.ToUInt32();
                crapto1.Crypto1Word(Uid ^ nt);
            }
            else // Nested 驗證
            {
                var authParity = new byte[4];
                Crypto1.Encrypt(auth, authParity, 0, 4);
                Device.InitiatorTransceiveBits(auth, 32, authParity, rxBuffer, MAX_FRAME_LEN, null);
                nt      = rxBuffer.ToUInt32();
                nt      = nt ^ crapto1.Crypto1Word(Uid ^ nt, true);
                Crypto1 = null;
            }
            var nr           = 0x01020304u;
            var ar           = PrngSuccessor(nt, 64);
            var enNrAr       = nr.GetBytes().Concat(ar.GetBytes()).ToArray();
            var enNrArParity = new byte[8];

            crapto1.Encrypt(enNrAr, enNrArParity, 0, 4, true);
            crapto1.Encrypt(enNrAr, enNrArParity, 4, 4);
            Device.InitiatorTransceiveBits(enNrAr, 64, enNrArParity, rxBuffer, MAX_FRAME_LEN, null);
            var at = rxBuffer.ToUInt32() ^ crapto1.Crypto1Word();

            if (at != PrngSuccessor(nt, 96))
            {
                throw new Exception("At error");
            }
            Crypto1 = crapto1;
            _sector = sector;
        }
예제 #7
0
        public void WriteBlock(byte b, byte[] blockData)
        {
            if (b / 4 != _sector || Crypto1 == null)
            {
                throw new Exception("Not auth");
            }
            var write = new byte[4] {
                0xA0, b, 0, 0
            };

            Iso14443aCrcAppend(write, 2);
            var writeParity = new byte[4];

            Crypto1.Encrypt(write, writeParity, 0, 4);
            var resbits = Device.InitiatorTransceiveBits(write, 32, writeParity, rxBuffer, MAX_FRAME_LEN, null);
            var res     = 0;

            for (int i = 0; i < 4; i++)
            {
                res |= ((rxBuffer[0] >> i) ^ Crypto1.Crypto1Bit()) << i;
            }
            if (res != 0x0A && res != 0x0E) // 0x0A ACK, 0x0E NAK
            {
                throw new Exception("Cmd Error: " + res.ToString("x2"));
            }

            var block       = new byte[18]; // 16byte data + 2byte crc
            var blockParity = new byte[18];

            if (blockData != null)
            {
                Array.Copy(blockData, block, blockData.Length > 16 ? 16 : blockData.Length);
            }
            Iso14443aCrcAppend(block, 16);
            Crypto1.Encrypt(block, blockParity, 0, 18);
            resbits = Device.InitiatorTransceiveBits(block, 144, blockParity, rxBuffer, MAX_FRAME_LEN, null);
            res     = 0;
            for (int i = 0; i < 4; i++)
            {
                res |= ((rxBuffer[0] >> i) ^ Crypto1.Crypto1Bit()) << i;
            }
            if (res != 0x0A && res != 0x0E) // 0x0A ACK, 0x0E NAK
            {
                throw new Exception("Cmd Error: " + res.ToString("x2"));
            }
        }
예제 #8
0
        public void MfKey32_SameNtTwoNonce(uint uid, uint nt, uint nr0, uint nr1, ulong expectedKey)
        {
            var p64     = Crypto1.PrngSuccessor(nt, 64);
            var crypto1 = new Crypto1(expectedKey);

            crypto1.Crypto1Word(uid ^ nt);
            nr0 ^= crypto1.Crypto1Word(nr0);
            var ar0 = p64 ^ crypto1.Crypto1Word();

            crypto1 = new Crypto1(expectedKey);
            crypto1.Crypto1Word(uid ^ nt);
            nr1 ^= crypto1.Crypto1Word(nr1);
            var ar1 = p64 ^ crypto1.Crypto1Word();

            var key = MfKey.MfKey32(uid, nt, nr0, ar0, nr1, ar1);

            Assert.AreEqual(expectedKey, key);
        }
예제 #9
0
        static void ReadBlock(Crypto1 crapto1, byte b)
        {
            abtRead[1] = b;
            Iso14443aCrcAppend(abtRead, 2);
            var enAbtRead       = abtRead.ToArray();
            var enAbtReadParity = new byte[4];

            crapto1.Encrypt(enAbtRead, enAbtReadParity, 0, 4);
            device.InitiatorTransceiveBits(enAbtRead, 32, enAbtReadParity, abtRx, MAX_FRAME_LEN, null);
            var block = new byte[18]; // 16byte data + 2byte crc

            for (int i = 0; i < 18; i++)
            {
                block[i] = (byte)(abtRx[i] ^ crapto1.Crypto1Byte());
            }
            Write("      Block{0,2}: ", b);
            PrintHex(block, 16);
        }
예제 #10
0
        public byte[] ReadBlock(byte b)
        {
            if (b / 4 != _sector || Crypto1 == null)
            {
                throw new Exception("Not auth");
            }
            var read = new byte[4] {
                0x30, b, 0, 0
            };

            Iso14443aCrcAppend(read, 2);
            var readParity = new byte[4];

            Crypto1.Encrypt(read, readParity, 0, 4);
            Device.InitiatorTransceiveBits(read, 32, readParity, rxBuffer, MAX_FRAME_LEN, null);
            for (int i = 0; i < 18; i++) // 16byte data + 2byte crc
            {
                rxBuffer[i] ^= Crypto1.Crypto1Byte();
            }
            return(rxBuffer.Take(16).ToArray());
        }
예제 #11
0
        public void MfKey32_SameNtManyNonce(uint uid, uint nt, int randomSeed, int nonceCount, ulong expectedKey)
        {
            var    p64  = Crypto1.PrngSuccessor(nt, 64);
            var    list = new List <Nonce>();
            Random rnd  = new Random(randomSeed);

            for (int i = 0; i < nonceCount; i++)
            {
                var crypto1 = new Crypto1(expectedKey);
                crypto1.Crypto1Word(uid ^ nt);
                var nr = (uint)rnd.Next();
                list.Add(new Nonce()
                {
                    Nr = crypto1.Crypto1Word(nr) ^ nr,
                    Ar = p64 ^ crypto1.Crypto1Word()
                });
            }

            var key = MfKey.MfKey32(uid, nt, list);

            Assert.AreEqual(expectedKey, key);
        }
예제 #12
0
        void ServeriDinle()
        {
            while (true)
            {
                string serverdanGelenMesaj = serverReader.ReadLine(); // Okunan deger

                if (cbChoose.SelectedIndex == 1)
                {
                    if (!isSecretKey)
                    {
                        isSecretKey = true;
                        label3.Text = Crypto1.DecryptSecretKey(serverdanGelenMesaj);
                        simetricKey = label3.Text;
                        lstMesajlarClient.Items.Add("SecretKey başarılı şekilde alındı.");
                        LogWriter("SecretKey başarılı şekilde alındı.");
                    }
                    else
                    {
                        Crypto1 crypto1 = new Crypto1();
                        MessageBox.Show("Desifrelenecek verinin çozulecegi yolu seciniz.");

                        UnicodeEncoding ue        = new UnicodeEncoding();
                        Byte[]          buffer    = Convert.FromBase64String(serverdanGelenMesaj);
                        byte[]          plainText = crypto1.DecryptToByteArray(buffer, simetricKey);

                        //File.WriteAllBytes(@"C:\Users\Hknaksoyy\Desktop\cipherText.jpg", plainText);
                        //linkFilePath_LinkClicked(true);
                        File.WriteAllBytes(dataPath, plainText);
                        lstMesajlarClient.Items.Add("Desifreleme islemi tamamlandi");
                        LogWriter("Desifreleme islemi tamamlandi");
                    }
                }
                else if (cbChoose.SelectedIndex == 2)
                {
                    if (!isSecretKey)
                    {
                        isSecretKey = true;
                        label3.Text = Crypto2.DecryptSecretKey(serverdanGelenMesaj);
                        simetricKey = label3.Text;
                        LogWriter("Serverdan Gelen Mesaj: " + serverdanGelenMesaj);
                        LogWriter("Cozumlenmis Simetrik Sifre: " + simetricKey);
                        lstMesajlarClient.Items.Add("SecretKey başarılı şekilde alındı.");
                        LogWriter("SecretKey başarılı şekilde alındı.");
                    }
                    else
                    {
                        Crypto2 crypto2      = new Crypto2();
                        string  decryptoHash = serverdanGelenMesaj.Substring((serverdanGelenMesaj.Length - 64), 64);
                        string  data         = serverdanGelenMesaj.Substring(0, (serverdanGelenMesaj.Length - 64));
                        if (decryptoHash == ComputeSha256Hash(data))
                        {
                            lstMesajlarClient.Items.Add("Server: " + crypto2.DecryptKey(data, simetricKey));
                            label3.Text = serverdanGelenMesaj;
                            LogWriter(serverdanGelenMesaj);
                        }
                    }
                }
                else if (cbChoose.SelectedIndex == 3)
                {
                    Crypto3 crypto3 = new Crypto3();
                    lstMesajlarClient.Items.Add("Server: " + crypto3.Decrypto(serverdanGelenMesaj));
                    label3.Text = serverdanGelenMesaj;
                    LogWriter(serverdanGelenMesaj);
                }
                else
                {
                    lstMesajlarClient.Items.Add("Server: " + serverdanGelenMesaj);
                    LogWriter("Server: " + serverdanGelenMesaj);
                }
            }
        }
예제 #13
0
        private void BtnGonderServer_Click(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex == 1)
            {
                if (!isSecretKey && !string.IsNullOrEmpty(txtMesajServer.Text))
                {
                    string publicKeyXML = String.Format(@"<RSAKeyValue>
                                                               <Modulus>{0}</Modulus>
                                                               <Exponent>{1}</Exponent>
                                                            </RSAKeyValue>",
                                                        ConfigurationSettings.AppSettings.Get("Modulus"),
                                                        ConfigurationSettings.AppSettings.Get("Exponent"));

                    string encryptSecretKey = Crypto2.EncryptSecretKey(txtMesajServer.Text, publicKeyXML);
                    LogWriter("Sifrelenecek Mesaj : " + txtMesajServer.Text);
                    LogWriter("Sifrelenmis Gizli Anahtar : " + encryptSecretKey);
                    clientWriter.WriteLine(encryptSecretKey);
                    clientWriter.Flush();
                    isSecretKey = true;
                }
                else
                {
                    Crypto1 crypto1      = new Crypto1();
                    byte[]  acikMetin    = File.ReadAllBytes(m_ImageFilePath);
                    byte[]  sifreliMetin = crypto1.EncryptToByteArray(acikMetin, simetricKey);

                    clientWriter.WriteLine(/*"UPLOAD_START_" +*/ Convert.ToBase64String(sifreliMetin) /*+ "_UPLOAD_END"*/);
                    clientWriter.Flush();

                    lstMesajlarServer.Items.Add("Dosya yolu : " + m_ImageFilePath + " gönderildi.");
                    LogWriter("Dosya yolu : " + m_ImageFilePath + " gönderildi.");
                }
            }
            else if (comboBox1.SelectedIndex == 2)
            {
                //Gizli anahtarın paylaşımını sağlar.
                if (!isSecretKey && !string.IsNullOrEmpty(txtMesajServer.Text))
                {
                    string publicKeyXML = String.Format(@"<RSAKeyValue>
                                                               <Modulus>{0}</Modulus>
                                                               <Exponent>{1}</Exponent>
                                                            </RSAKeyValue>",
                                                        ConfigurationSettings.AppSettings.Get("Modulus"),
                                                        ConfigurationSettings.AppSettings.Get("Exponent"));

                    string encryptSecretKey = Crypto2.EncryptSecretKey(txtMesajServer.Text, publicKeyXML);
                    LogWriter("Sifrelenecek Mesaj : " + txtMesajServer.Text);
                    LogWriter("Sifrelenmis Gizli Anahtar : " + encryptSecretKey);
                    clientWriter.WriteLine(encryptSecretKey);
                    clientWriter.Flush();
                    simetricKey = txtMesajServer.Text;
                    isSecretKey = true;
                }
                else
                {
                    Crypto2 crypto2   = new Crypto2();
                    string  encrypted = crypto2.EncryptKey(txtMesajServer.Text, simetricKey);
                    //GONDERILEN KISIM
                    string encryptedHash = encrypted;
                    encryptedHash += ComputeSha256Hash(encrypted);
                    clientWriter.WriteLine(encryptedHash);
                    clientWriter.Flush();
                    //SERVER'IN KENDI LISTBOX'INA EKLEME ISLEMI
                    lstMesajlarServer.Items.Add("Server: " + txtMesajServer.Text);
                    LogWriter("Server: " + txtMesajServer.Text);
                }
            }
            else if (comboBox1.SelectedIndex == 3)
            {
                Crypto3 crypto3   = new Crypto3();
                string  encrypted = crypto3.Encrypto(txtMesajServer.Text);
                //GONDERILEN KISIM
                clientWriter.WriteLine(encrypted);
                clientWriter.Flush();
                //SERVER'IN KENDI LISTBOX'INA EKLEME ISLEMI
                lstMesajlarServer.Items.Add("Server: " + txtMesajServer.Text);
                LogWriter("Server: " + txtMesajServer.Text);
            }
            else
            {
                clientWriter.WriteLine(txtMesajServer.Text);
                clientWriter.Flush();
                lstMesajlarServer.Items.Add("Server: " + txtMesajServer.Text);
                LogWriter("Server: " + txtMesajServer.Text);
            }
            //GONDERIM ISLEMINDEN SONRA TEXT BOLGESI TEMIZLENIR.
            txtMesajServer.Clear();
        }
예제 #14
0
        static void Main(string[] args)
        {
            byte[] abtRawUid = new byte[12];
            byte[] abtAtqa   = new byte[2];
            byte   abtSak    = 0;

            byte[] abtAts          = new byte[MAX_FRAME_LEN];
            uint   szAts           = 0;
            bool   isoAtsSupported = false;
            bool   forceRats       = false;
            uint   szCL            = 1;

            try
            {
                using (var context = new NfcContext())
                    using (device = context.OpenDevice()) // Try to open the NFC reader
                    {
                        // Initialise NFC device as "initiator"
                        device.InitiatorInit();
                        // Configure the CRC
                        device.DeviceSetPropertyBool(NfcProperty.HandleCrc, false);
                        // Use raw send/receive methods
                        device.DeviceSetPropertyBool(NfcProperty.EasyFraming, false);
                        // Disable 14443-4 autoswitching
                        device.DeviceSetPropertyBool(NfcProperty.AutoIso14443_4, false);
                        WriteLine("NFC reader: {0} opened", device.Name);
                        WriteLine();
                        // Send the 7 bits request command specified in ISO 14443A (0x26)
                        TransmitBits(abtReqa, 7);
                        Array.Copy(abtRx, abtAtqa, 2);
                        // Anti-collision
                        TransmitBytes(abtSelectAll, 2);
                        // Check answer
                        if ((abtRx[0] ^ abtRx[1] ^ abtRx[2] ^ abtRx[3] ^ abtRx[4]) != 0)
                        {
                            WriteLine("WARNING: BCC check failed!");
                        }
                        // Save the UID CL1
                        Array.Copy(abtRx, abtRawUid, 4);


                        //Prepare and send CL1 Select-Command
                        Array.Copy(abtRx, 0, abtSelectTag, 2, 5);
                        Iso14443aCrcAppend(abtSelectTag, 7);
                        TransmitBytes(abtSelectTag, 9);
                        abtSak = abtRx[0];

                        #region CL
                        // Test if we are dealing with a CL2
                        if ((abtSak & CASCADE_BIT) != 0)
                        {
                            szCL = 2; // or more
                                      // Check answer
                            if (abtRawUid[0] != 0x88)
                            {
                                WriteLine("WARNING: Cascade bit set but CT != 0x88!");
                            }
                        }

                        if (szCL == 2)
                        {
                            // We have to do the anti-collision for cascade level 2

                            // Prepare CL2 commands
                            abtSelectAll[0] = 0x95;

                            // Anti-collision
                            TransmitBytes(abtSelectAll, 2);

                            // Check answer
                            if ((abtRx[0] ^ abtRx[1] ^ abtRx[2] ^ abtRx[3] ^ abtRx[4]) != 0)
                            {
                                WriteLine("WARNING: BCC check failed!");
                            }

                            // Save UID CL2
                            Array.Copy(abtRx, 0, abtRawUid, 4, 4);

                            // Selection
                            abtSelectTag[0] = 0x95;
                            Array.Copy(abtRx, 0, abtSelectTag, 2, 5);
                            Iso14443aCrcAppend(abtSelectTag, 7);
                            TransmitBytes(abtSelectTag, 9);
                            abtSak = abtRx[0];

                            // Test if we are dealing with a CL3
                            if ((abtSak & CASCADE_BIT) != 0)
                            {
                                szCL = 3;
                                // Check answer
                                if (abtRawUid[0] != 0x88)
                                {
                                    WriteLine("WARNING: Cascade bit set but CT != 0x88!");
                                }
                            }

                            if (szCL == 3)
                            {
                                // We have to do the anti-collision for cascade level 3

                                // Prepare and send CL3 AC-Command
                                abtSelectAll[0] = 0x97;
                                TransmitBytes(abtSelectAll, 2);

                                // Check answer
                                if ((abtRx[0] ^ abtRx[1] ^ abtRx[2] ^ abtRx[3] ^ abtRx[4]) != 0)
                                {
                                    WriteLine("WARNING: BCC check failed!");
                                }

                                // Save UID CL3
                                Array.Copy(abtRx, 0, abtRawUid, 8, 4);

                                // Prepare and send final Select-Command
                                abtSelectTag[0] = 0x97;
                                Array.Copy(abtRx, 0, abtSelectTag, 2, 5);
                                Iso14443aCrcAppend(abtSelectTag, 7);
                                TransmitBytes(abtSelectTag, 9);
                                abtSak = abtRx[0];
                            }
                        }
                        #endregion

                        // Request ATS, this only applies to tags that support ISO 14443A-4
                        if ((abtRx[0] & SAK_FLAG_ATS_SUPPORTED) != 0)
                        {
                            isoAtsSupported = true;
                        }
                        if ((abtRx[0] & SAK_FLAG_ATS_SUPPORTED) != 0 || forceRats)
                        {
                            Iso14443aCrcAppend(abtRats, 2);
                            int szRx = TransmitBytes(abtRats, 4);
                            if (szRx >= 0)
                            {
                                Array.Copy(abtRx, abtAts, szRx);
                                szAts = (uint)szRx;
                            }
                        }

                        WriteLine();
                        WriteLine("驗證Block 0");
                        // 驗證 Block 0
                        Iso14443aCrcAppend(abtAuthA, 2);
                        TransmitBytes(abtAuthA, 4);
                        // 自己控制 Parity bit
                        device.DeviceSetPropertyBool(NfcProperty.HandleParity, false);

                        var nt  = abtRx.ToUInt32();
                        var uid = abtRawUid.ToUInt32();
                        Write("           Nt: ");
                        PrintHex(abtRx, 4);
                        var crapto1 = new Crypto1(0xFFFFFFFFFFFFu);
                        // 初始化 crapto1 狀態 feed in uid^nt and drop keystream in the first round
                        crapto1.Crypto1Word(uid ^ nt);
                        // 自訂讀卡機端nonce
                        var nr = 0x01020304u;
                        // Ar 為 suc2(nt)
                        var ar = PrngSuccessor(nt, 64);
                        // 加密 Nr,suc2(Nt) 和 parity bit
                        var enNrAr       = nr.GetBytes().Concat(ar.GetBytes()).ToArray();
                        var enNrArParity = new byte[8];
                        crapto1.Encrypt(enNrAr, enNrArParity, 0, 4, true);
                        crapto1.Encrypt(enNrAr, enNrArParity, 4, 4);
                        Write("[Nr,suc2(Nt)]: ");
                        PrintHex(enNrAr, 8);
                        // 送出[Nr,suc2(Nt)]
                        device.InitiatorTransceiveBits(enNrAr, 64, enNrArParity, abtRx, MAX_FRAME_LEN, null);
                        var enAt = new byte[4];
                        Array.Copy(abtRx, enAt, 4);
                        Write("   [suc3(Nt)]: ");
                        PrintHex(enAt, 4);
                        // 解密[at]
                        var at = enAt.ToUInt32() ^ crapto1.Crypto1Word();
                        WriteLine("At: {0:x8} == suc3(Nt):{1:x8}", at, PrngSuccessor(nt, 96));
                        // 讀取 Block
                        for (byte i = 0; i < 4; i++)
                        {
                            ReadBlock(crapto1, i);
                        }
                        WriteLine();
                        WriteLine("Nested驗證 Block 4");
                        // Nested驗證 Block 4
                        abtAuthA[1] = 4;
                        Iso14443aCrcAppend(abtAuthA, 2);
                        var enAuth       = abtAuthA.ToArray();
                        var enAuthParity = new byte[4];
                        crapto1.Encrypt(enAuth, enAuthParity, 0, 4);
                        device.InitiatorTransceiveBits(enAuth, 32, enAuthParity, abtRx, MAX_FRAME_LEN, null);

                        // 開始Nested驗證的新crypto1密鑰
                        crapto1 = new Crypto1(0xFFFFFFFFFFFFu);
                        Write("     未解密Nt: ");
                        PrintHex(abtRx, 4);
                        var enNt = abtRx.ToUInt32();
                        // 初始化 crapto1 狀態 用加密的Nt,並解出明文nt
                        nt = enNt ^ crapto1.Crypto1Word(uid ^ enNt, true);
                        Write("           Nt: ");
                        PrintHex(nt.GetBytes(), 4);
                        // 自訂讀卡機端nonce
                        nr = 0x01020304u;
                        // Ar 為 suc2(nt)
                        ar = PrngSuccessor(nt, 64);
                        // 加密 Nr,suc2(Nt) 和 parity bit
                        enNrAr       = nr.GetBytes().Concat(ar.GetBytes()).ToArray();
                        enNrArParity = new byte[8];
                        crapto1.Encrypt(enNrAr, enNrArParity, 0, 4, true);
                        crapto1.Encrypt(enNrAr, enNrArParity, 4, 4);
                        Write("[Nr,suc2(Nt)]: ");
                        PrintHex(enNrAr, 8);
                        // 送出[Nr,suc2(Nt)]
                        var res = device.InitiatorTransceiveBits(enNrAr, 64, enNrArParity, abtRx, MAX_FRAME_LEN, null);
                        enAt = new byte[4];
                        Array.Copy(abtRx, enAt, 4);
                        Write("   [suc3(Nt)]: ");
                        PrintHex(enAt, 4);
                        // 解密[at]
                        at = enAt.ToUInt32() ^ crapto1.Crypto1Word();
                        WriteLine("At: {0:x8} == suc3(Nt):{1:x8}", at, PrngSuccessor(nt, 96));

                        // 寫入 Block4
                        WriteBlock(crapto1, 4, new byte[16] {
                            65, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
                        });

                        // 讀取 Block
                        for (byte i = 4; i < 8; i++)
                        {
                            ReadBlock(crapto1, i);
                        }

                        WriteLine();

                        // device.DeviceSetPropertyBool(NfcProperty.HandleParity, true);
                        // Done, halt the tag now
                        Iso14443aCrcAppend(abtHalt, 2);
                        TransmitBytes(abtHalt, 4);
                    }
            }
            catch (Exception ex)
            {
                WriteLine(ex.Message);
                Environment.Exit(1);
            }
            WriteLine();
            WriteLine("Found tag with");
            Write(" UID: ");
            switch (szCL)
            {
            case 1:
                Write("{0:x2}{1:x2}{2:x2}{3:x2}", abtRawUid[0], abtRawUid[1], abtRawUid[2], abtRawUid[3]);
                break;

            case 2:
                Write("{0:x2}{1:x2}{2:x2}", abtRawUid[1], abtRawUid[2], abtRawUid[3]);
                Write("{0:x2}{1:x2}{2:x2}{3:x2}", abtRawUid[4], abtRawUid[5], abtRawUid[6], abtRawUid[7]);
                break;

            case 3:
                Write("{0:x2}{1:x2}{2:x2}", abtRawUid[1], abtRawUid[2], abtRawUid[3]);
                Write("{0:x2}{1:x2}{2:x2}", abtRawUid[5], abtRawUid[6], abtRawUid[7]);
                Write("{0:x2}{1:x2}{2:x2}{3:x2}", abtRawUid[8], abtRawUid[9], abtRawUid[10], abtRawUid[11]);
                break;
            }
            WriteLine();
            WriteLine("ATQA: {0:x2}{1:x2}", abtAtqa[1], abtAtqa[0]);
            WriteLine(" SAK: {0:x2}", abtSak);
            if (szAts > 1)
            { // if = 1, it's not actual ATS but error code
                if (forceRats && !isoAtsSupported)
                {
                    WriteLine(" RATS forced");
                }
                Write(" ATS: ");
                PrintHex(abtAts, szAts);
            }

            ReadLine();
        }
예제 #15
0
        void Dinle()
        {
            // Bağlanan kullanıcı sckKullanici isimli Socket nesnesine alındı.
            sckKullanici = dinleyici.AcceptSocket();
            LogWriter("Kullanıcı geldi");

            // NetworkStream, ağ üzerine yazmak için kullanılır.
            ns = new NetworkStream(sckKullanici);

            // Kullanıcıya mesaj göndermek ve almak için StreamWriter içe NetworkStream üzerine yazacağız.
            clientWriter = new StreamWriter(ns, Encoding.ASCII);
            clientReader = new StreamReader(ns, Encoding.ASCII);

            while (true)
            {
                string clienttanGelenMesaj = clientReader.ReadLine();

                if (comboBox1.SelectedIndex == 1)
                {
                    Crypto1 crypto1 = new Crypto1();

                    UnicodeEncoding ue     = new UnicodeEncoding();
                    Byte[]          buffer = Convert.FromBase64String(clienttanGelenMesaj);

                    byte[] plainText = crypto1.DecryptToByteArray(buffer, simetricKey);

                    File.WriteAllBytes(dataPath, plainText);
                    lstMesajlarServer.Items.Add("Desifreleme islemi tamamlandi");
                    LogWriter("Desifreleme islemi tamamlandi");

                    //File.WriteAllBytes(@"C:\Users\Hknaksoyy\Desktop\cipherText.jpg", plainText);
                    //LinkLabelLinkClickedEventArgs ex = new LinkLabelLinkClickedEventArgs();
                    //LinkFilePath_LinkClicked = true;
                    //this.LinkFilePath_LinkClicked += this.LinkFilePath_LinkClicked;
                }
                else if (comboBox1.SelectedIndex == 2)
                {
                    if (!string.IsNullOrEmpty(clienttanGelenMesaj))
                    {
                        Crypto2 crypto2      = new Crypto2();
                        string  decryptoHash = clienttanGelenMesaj.Substring((clienttanGelenMesaj.Length - 64), 64);
                        string  data         = clienttanGelenMesaj.Substring(0, (clienttanGelenMesaj.Length - 64));
                        if (ComputeSha256Hash(data) == decryptoHash)
                        {
                            lstMesajlarServer.Items.Add(connectName + ": " + crypto2.DecryptKey(data, simetricKey));
                            label2.Text = clienttanGelenMesaj;
                            LogWriter(clienttanGelenMesaj);
                        }
                    }
                }
                else if (comboBox1.SelectedIndex == 3)
                {
                    Crypto3 crypto3 = new Crypto3();
                    lstMesajlarServer.Items.Add(connectName + ": " + crypto3.Decrypto(clienttanGelenMesaj));
                    label2.Text = clienttanGelenMesaj;
                    LogWriter(clienttanGelenMesaj);
                }
                // Acik metin şeklinde iletimi saglar.
                else
                {
                    if (clienttanGelenMesaj.EndsWith(" isimli kullanici geldi."))
                    {
                        // Gelen kullanıcının tanımlanmasıdır.
                        Console.WriteLine(clienttanGelenMesaj);
                        connectName = clienttanGelenMesaj.Substring(0, clienttanGelenMesaj.Length - 24);
                        lstMesajlarServer.Items.Add(clienttanGelenMesaj);
                        LogWriter(clienttanGelenMesaj);
                    }
                    else
                    {
                        lstMesajlarServer.Items.Add(connectName + ": " + clienttanGelenMesaj);
                        LogWriter(connectName + ": " + clienttanGelenMesaj);
                    }
                }
            }
        }
예제 #16
0
        public void Lfsr(ulong key)
        {
            var crypto1 = new Crypto1(key);

            Assert.AreEqual(key, crypto1.Lfsr);
        }
예제 #17
0
        public void PeekCrypto1Bit(ulong key)
        {
            var crypto1 = new Crypto1(key);

            Assert.AreEqual(Crypto1.Filter(crypto1.State.Odd), crypto1.PeekCrypto1Bit());
        }