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;
        }
    }
}

输入密钥MOTHERFUCKER
如图,输入秘钥key,明文plaintext,获得你的密文ciphertext
还可以解密回原来的明文。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C#维吉尼亚加密解密代码,您可以根据需要进行修改和使用: ```csharp using System; namespace VigenereCipher { class Program { static void Main(string[] args) { Console.WriteLine("请选择操作:\n1. 加密\n2. 解密"); int choice = int.Parse(Console.ReadLine()); Console.WriteLine("请输入明文/密文:"); string text = Console.ReadLine(); Console.WriteLine("请输入密钥:"); string key = Console.ReadLine(); if (choice == 1) { string cipherText = Encrypt(text, key); Console.WriteLine("加密后的结果为:" + cipherText); } else if (choice == 2) { string plainText = Decrypt(text, key); Console.WriteLine("解密后的结果为:" + plainText); } else { Console.WriteLine("输入错误!"); } } static string Encrypt(string text, string key) { string cipherText = ""; int keyIndex = 0; for (int i = 0; i < text.Length; i++) { char c = text[i]; int offset = key[keyIndex] - 'A'; char encryptedChar = (char)((c + offset) % 256); cipherText += encryptedChar; keyIndex = (keyIndex + 1) % key.Length; } return cipherText; } static string Decrypt(string text, string key) { string plainText = ""; int keyIndex = 0; for (int i = 0; i < text.Length; i++) { char c = text[i]; int offset = key[keyIndex] - 'A'; char decryptedChar = (char)((c - offset + 256) % 256); plainText += decryptedChar; keyIndex = (keyIndex + 1) % key.Length; } return plainText; } } } ``` 以上代码实现维吉尼亚加密解密的功能,并添加了简单的菜单选项,您可以根据需要进行修改和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值