11 Mayıs 2012 Cuma

BİFİD ŞİFRELEME C#


Bifid şifreleme de, 5x5 bir matris alınır,  satır ve sütunlar numaralandırılır. Bu matris bizim rasgele oluşturacağımız matristir. 5x5 olabileceği gibi,7x7 veya 8x8 gibi orantılı büyüklüklerde matris oluşturabiliriz.
Açıklama: http://www.volkanatasever.com/image.axd?picture=2009%2f11%2fbifid1.jpg
Mesajı sabit sayıda harf içeren parçalara ayrılır, daha sonra her harfin altına satır ve kolon numaraları yazılır. Bu sayede matrisimizde satır ve sütun rakamlarını kullanmış oluruz. Gruplamalar matrisin satır veya sütun büyüklüğü kadardır.
Açıklama: http://www.volkanatasever.com/image.axd?picture=2009%2f11%2fbifid2.jpg
ve daha sonra her grup içinde kalarak sayıları sırasıyla 11555 14535 52453 33435 . . . şeklinde okuyup ikili rakamlardan oluşan 11 55 51 45 35 52 . . . şeklindeki parçalara ayrılır. Ve bu parçaların tablodaki harf karşılıkları bize gizli bir mesaj verecektir.
Şifrelenmiş rakamımız bu sayede elimize geçmiş olacaktır.
Açıklama: http://www.volkanatasever.com/image.axd?picture=2009%2f11%2fbifid3.jpg
Bu şifreleme için kullandığım arayüz aşağıdadır. Konsol uygulaması olarak sade bir arayüz kullandım.

   class Program
    {
        static void Main(string[] args)
        {
            string d;
            do{
            Bifid bfd = new Bifid();
           
            Console.WriteLine("\nBifid Şifreleme");
            Console.WriteLine("Açmak için 1");
            Console.WriteLine("Şifreleme için 2");
            Console.WriteLine("Çıkmak için 5");
            d=Console.ReadLine();
            if(d=="1"){
                string msj;
                string don;
                Console.WriteLine("Decrypt yapılacak mesajı girin");
                msj = Console.ReadLine();
                don=bfd.EncryptDecrypt(msj, false);
                Console.Write(don);
            }
            else if(d=="2"){
                string msj;
                string don;
                Console.WriteLine("Encrypt yapılacak mesajı girin");
                msj = Console.ReadLine();
                don = bfd.EncryptDecrypt(msj, true);
                Console.WriteLine(don);
            }
            else if(d=="5")
                break;
            else
            Console.WriteLine("Lütfen seçim yağınız çıkış için 5");
          
            }while(d!="5");
        }
    }
Bifid Algoritması için bifid şifreleme sınıfım;
public class Bifid
    {
        string[,] KeyMatrix = new string[5, 5];
 
        public Bifid()
        {
            BuildKeyMatrix();
        }
 
        private void BuildKeyMatrix()
        {
            int k = 65;
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (k == 74) { k++; } // j’yi alma  (j ascii = 64)
                    KeyMatrix[i, j] = ((char)k).ToString();
                    k++;
                }
            }
        }
 
        public string EncryptDecrypt(string Text, bool Encrypt)
        {
            int k = 0;
            string CharofMessage = string.Empty;
            StringBuilder sb1 = new StringBuilder();
            StringBuilder sb2 = new StringBuilder();
            StringBuilder sbOut = new StringBuilder();
            bool HasGotChar = false;
 
            while (k < Text.Length)
            {
                CharofMessage = Text.Substring(k, 1);
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (string.Compare(KeyMatrix[i, j], CharofMessage, true) == 0)
                        {
                            sb1.Append(i.ToString());
                            if (Encrypt)
                                sb2.Append(j.ToString());
                            else
                                sb1.Append(j.ToString());
                            HasGotChar = true;
                            break;
                        }
                    }
                    if (HasGotChar)
                    {
                        HasGotChar = false;
                        break;
                    }
                }
                k++;
            }
 
            k = 0;
 
            if (Encrypt)
            {
                sb1.Append(sb2.ToString());
                while (k < sb1.Length)
                {
                    sbOut.Append(KeyMatrix[Convert.ToInt32(sb1[k].ToString()), Convert.ToInt32(sb1[k + 1].ToString())]);
                    k += 2;
                }
            }
            else
            {
                int SplitNum = (sb1.Length) / 2;
                while (k < SplitNum)
                {
                    sbOut.Append(KeyMatrix[Convert.ToInt32(sb1[k].ToString()), Convert.ToInt32(sb1[k + SplitNum].ToString())]);
                    k++;
                }
            }
 
            return sbOut.ToString();
        }
    }

Hiç yorum yok:

Yorum Gönder