/**
         * @brief  Bu fonksiyon; istenilen bir DES (Data Encryption Standart) modunda, kendisine verilen
         *         veri dizisini sifreler ve sifrelenmis dizi olarak geri dondurur.
         * @param  plainData
         * @param  cipherMode
         * @retval cipherData
         */
        public UInt64[] Encrypt_Data(UInt64[] plainData, DES_Mode_Enum cipherMode)
        {
            UInt64[] cipherData  = new UInt64[plainData.Length];
            UInt64   chainBuffer = 0x0000000000000000;
            UInt16   i           = 0;

            switch (cipherMode)
            {
            /* DES - CBC (Cipher Block Chaining) sifreleme rutini */
            case DES_Mode_Enum.CBC:

                Get_Subkeys();

                /* acik verinin ilk elemani IV (Initialization Vector) ile XOR'landiktan sonra sifreleniyor */
                chainBuffer   = (IV ^ plainData[0]);
                cipherData[0] = Encode_BlockData(chainBuffer);

                /* IV ile ilk veri elemaninin sifrelenmesinin ardindan her bir sifrelenmis veri bir sonraki
                 * verinin sifrelenmesinde rol oynuyor. Boylece sifre blok zinciri olusturulmus oluyor */
                for (i = 1; i < plainData.Length; i++)
                {
                    chainBuffer = (cipherData[i - 1] ^ plainData[i]);

                    cipherData[i] = Encode_BlockData(chainBuffer);
                }

                break;

            /* DES - ECB (Electronic Code Book) sifreleme rutini */
            case DES_Mode_Enum.ECB:

                Get_Subkeys();

                /* acik veri tek tek sifrelenerek sifrelenmis veri dizisine aktariliyor */
                for (i = 0; i < plainData.Length; i++)
                {
                    cipherData[i] = Encode_BlockData(plainData[i]);
                }

                break;

            default:
                // bu satir bilerek bos birakildi
                break;
            }

            return(cipherData);
        }
        /**
         * @brief  Bu fonksiyon; istenilen bir DES (Data Encryption Standart) modunda, kendisine verilen
         *         sifrelenmis veriyi cozerek geri dondurur.
         * @param  cipherData
         * @param  cipherMode
         * @retval plainData
         */
        public UInt64[] Decrypt_Data(UInt64[] cipherData, DES_Mode_Enum cipherMode)
        {
            UInt64[] plainData   = new UInt64[cipherData.Length];
            UInt64   chainBuffer = 0x0000000000000000;
            UInt16   i           = 0;

            switch (cipherMode)
            {
            /* DES - CBC (Cipher Block Chaining) sifre cozme rutini */
            case DES_Mode_Enum.CBC:

                Get_Subkeys();

                /* sifreli verinin ilk elemaninin sifresi cozulup IV (Initialization Vector) ile XOR'laniyor */
                chainBuffer  = Decode_BlockData(cipherData[0]);
                plainData[0] = (chainBuffer ^ IV);

                /* her bir datanin sirayla sifresi cozulup bir onceki veri ile XOR islemine tabi tutuluyor */
                for (i = 1; i < cipherData.Length; i++)
                {
                    chainBuffer = Decode_BlockData(cipherData[i]);

                    plainData[i] = (chainBuffer ^ cipherData[i - 1]);
                }

                break;

            /* DES - ECB (Electronic Code Book) sifre cozme rutini */
            case DES_Mode_Enum.ECB:

                Get_Subkeys();

                /* sifrelenmis veri tek tek cozulerek acik veri dizisine aktariliyor */
                for (i = 0; i < cipherData.Length; i++)
                {
                    plainData[i] = Decode_BlockData(cipherData[i]);
                }

                break;

            default:

                break;
            }

            return(plainData);
        }