基於C#實現-維吉尼亞密碼加密、解密

王文詔-Martin發表於2020-10-31

前提是要有金鑰

  • 程式碼只是實現基本原理,未做錯誤處理,如果出錯了看一下自己輸入的是不是有問題。
  • 不區分大小寫輸入,以大寫的方式輸出
  • C#程式碼線上生成器,注意在下方標識處輸入你的明文,或者密文,然後複製到 線上生成器
  • 未做空格處理,輸入的時候不要有空格
using System;
using System.Threading;

namespace 密碼01
{
    class Program
    {
        public static string zimu = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        public static char[] charzimu = zimu.ToCharArray();
        static void Main(string[] args)
        {
            Console.WriteLine("選擇模式:a——加密,b——解密  並按下空格,只能輸入一個");
            if (Console.ReadLine() == "a")
            {
                Console.Clear();
                Console.WriteLine("進入加密模式");
                Console.Write("請輸入明文:");
                string mingwen = Console.ReadLine();
                mingwen = mingwen.ToUpper();
                Console.Write("請輸入金鑰:");
                string miyao = Console.ReadLine();
                miyao =miyao.ToUpper();

                Console.Write("你所得到的密文是:");
                string text = JiaMi(mingwen, miyao);
                Console.WriteLine(text);
            }
            else if (Console.ReadLine() == "b")
            {
                Console.Clear();
                Console.WriteLine("進入解密模式");
                Console.Write("請輸入密文:");
                string miwen = Console.ReadLine();
                miwen =miwen.ToUpper();
                Console.Write("請輸入金鑰:");
                string miyao = Console.ReadLine();
                miyao = miyao.ToUpper();

                Console.Write("你所得到的明文是:");
                string text = JieMi(miwen, miyao);
                Console.WriteLine(text);
            }
            else
            {
                Console.WriteLine("請重啟程式,輸入a或者b選擇模式");
            }
        }

        #region 解密部分
        public static string JieMi(string miwen, string miyao)
        {
            char[] newmiyao = PiPei(miwen, miyao);
            for (int i = 0; i < miwen.Length; i++)
            {
                int hanghao = zimu.IndexOf(newmiyao[i]);
                newmiyao[i] = ZhaoZiMu(hanghao, newmiyao[i]);
            }
            string text = new string(newmiyao);
            return text;
        }
        public static char[] GuoCheng(string a, char[] b)
        {
            char[] ch = a.ToCharArray();
            for (int i = 0; i < a.Length; i++)
            {
                int hanghao = zimu.IndexOf(b[i]);
                ch[i] = ZhaoZiMu(hanghao, b[i]);
            }
            return ch;
        }
        public static char ZhaoZiMu(int hang, Char ch)
        {
            string text = PaiHang(hang);
            int e = text.IndexOf(ch);
            return charzimu[e];
        }
        #endregion

        #region 加密部分
        public static string JiaMi(string mingwen, string miyao)
        {
            char[] newmiyao = PiPei(mingwen, miyao);

            char[] ch = mingwen.ToCharArray();
            for (int i = 0; i < mingwen.Length; i++)
            {
                int hanghao = zimu.IndexOf(newmiyao[i]);//金鑰的字母和行的字母進行比較,然後把所在位置拿出來
                int lie = zimu.IndexOf(ch[i]);
                ch[i] = JiaMiZiMu(hanghao, lie);//匹配行的字母然後找到所對應列的號,在把列號裡的字母取出來
            }
            string text = new string(ch);
            return text;
        }
        public static char JiaMiZiMu(int hanghao, int lie)
        {
            string str = PaiHang(hanghao);
            char ch = str[lie];
            return ch;
        }
        #endregion

        #region 公用
        public static char[] PiPei(string a, string b)
        {
            char[] ch = a.ToCharArray();//將字串轉換為字元陣列
            for (int i = 0; i < a.Length; i++)
            {
                ch[i] = b[i % b.Length];
            }//ch[]裝的是變換完的金鑰
            return ch;
        }

        public static string PaiHang(int hang)//重新排列行的字母序列
        {
            return zimu.Substring(hang) + zimu.Substring(0, hang);
        }
        #endregion
    }
}

相關文章