C#实现维吉尼亚密码的加密和解密

## 二话不说上源代码系列 ##
《C#实现维吉尼亚密码的加密和解密》

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Virginia
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please input your name as a key:");
            string key = Console.ReadLine();//定义密钥key

            Console.WriteLine("Please input your plaintext:");
            string plainText = Console.ReadLine();//定义明文plainText

            //------------------------------加密
            Console.WriteLine("Now here is your ciphertext:");
            string cipherText = encryption(key, plainText);//调用加密函数encryption
            Console.WriteLine(cipherText);

            //------------------------------解密
            Console.WriteLine("Now here is your original plaintext by decryption:");
            string plainText2 = decryption(cipherText, key);//调用解密函数decryption
            Console.WriteLine(plainText2);
        }

        //加密函数
        //(plainText+key)mod 26
        static string encryption(string key,string plainText)
        {
            string cipherText="";
            for(int i=0,j=0;i<plainText.Length;i++,j++)
            {
                if (j % (key.Length) == 0)//对密钥取模运算,从而重复与明文对应
                    j = 0;
                cipherText += Convert.ToChar(plainText[i] + key[j]-'A');//('p[i]'-'A')+('k[i]'-'A')+'A',先加后检测
                if (cipherText[i] > 'Z')//检测是否超过了Z
                {
                    char ch = Convert.ToChar(cipherText[i]-26);//c[i]-=26,相当于26个字母对Z26(整数空间)取模运算。
                    cipherText= cipherText.Remove(i, 1);
                    cipherText= cipherText.Insert(i,Convert.ToString(ch));
                }
            }
            return cipherText;
        }

        //解密函数
        //(plainText-key)mod 26
        static string decryption(string cipherText,string key)
        {
            string plainText = "";
            for(int i=0,j=0;i<cipherText.Length;i++,j++)
            {
                if (j % key.Length == 0)//对密钥取模运算,从而重复与明文对应
                    j = 0;
                if (cipherText[i] < key[j])//c[i]<k[i],则减出来的char小于0会影响结果故单独处理。
                    plainText += Convert.ToChar((cipherText[i]-key[j])%26+26+'A');//取模加26,从而变正数,然后加'A'
                else
                {
                    plainText += Convert.ToChar(cipherText[i] - key[j] + 'A');//c[i]和k[i]的距离加上'A'
                    if (plainText[i] > 'Z')//超过Z的处理
                    {
                        char ch =Convert.ToChar(plainText[i] - 26);
                        plainText = plainText.Remove(i, plainText[i]);//删除字符plainText[i]
                        plainText = plainText.Insert(i, Convert.ToString(ch));//原plainText[i]减26再插入到plainText[i]
                    }
                }
            }
            return plainText;
        }
    }
}

《C#实现维吉尼亚密码的加密和解密》
如图,输入秘钥key,明文plaintext,获得你的密文ciphertext
还可以解密回原来的明文。

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/joseph_cherry/article/details/52483524
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞