using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Vigenere
{
    public partial class Form1 : Form
    {
        private string[,] matrix = new string[26, 26];
        private ASCIIEncoding ascii = new ASCIIEncoding();

        //key
        private string key;
        //code
        private string code;
        //text
        private string text;

        public Form1()
        {
            InitializeComponent();
            #region Generate Virginia Martix
            for (int i = 0; i < 26; i++)
            {
                for (int j = 0; j < 26; j++)
                {
                    int number = 65 + i + j;
                    if (number > 90)
                    {
                        number -= 26;
                    }
                    byte[] bt = new byte[] { (byte)number };
                    matrix[i, j] = ascii.GetString(bt);
                }
            }
            #endregion
        }
        //加密
        private void button1_Click(object sender, EventArgs e)
        {
            key = this.txtKey.Text.ToString().ToUpper();
            code = "";
            text = this.txtText.Text.ToString().ToUpper();
            List<int> keyNum = new List<int>(); ;

            for (int i = 0; i < key.Length; i++)
            {
                string str = key.Substring(i, 1);
                keyNum.Add((int)ascii.GetBytes(str)[0] - 65);
            }

            int index = -1;
            for (int i = 0; i < this.text.Length; i++)
            {
                if (this.text.Substring(i, 1).ToString() == " ")
                {
                    code += " ";
                    continue;
                }
                index++;
                code += matrix[keyNum[index % key.Length], (int)ascii.GetBytes(this.text.Substring(i, 1))[0] - 65];
            }

            this.txtCode.Text = code.ToString();
        }
        //解密
        private void button2_Click(object sender, EventArgs e)
        {
            key = this.txtKey.Text.ToString().ToUpper();
            code = this.txtCode.Text.ToString().ToUpper();
            text = "";
            List<int> keyNum = new List<int>(); ;

            for (int i = 0; i < key.Length; i++)
            {
                string str = key.Substring(i, 1);
                keyNum.Add((int)ascii.GetBytes(str)[0] - 65);
            }

            int index = -1;
            for (int i = 0; i < this.code.Length; i++)
            {
                if (this.code.Substring(i, 1).ToString() == " ")
                {
                    text += " ";
                    continue;
                }
                index++;

                for (int j = 0; j < 26; j++)
                {
                    if (this.code.Substring(i, 1).ToString() == matrix[keyNum[index % key.Length], j])
                    {
                        byte[] bt = new byte[] { (byte)(j + 65) };
                        text += ascii.GetString(bt);
                    }
                }
            }

            this.txtText.Text = text.ToString();
        }
    }
}

对于维吉尼亚方阵及运用维吉尼亚方阵的加密与解密,可参考http://baike.baidu.com/view/270838.htm?fromTaglist

画面结果如下:

转自:http://www.cnblogs.com/coding4love/p/3296703.html

[加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)的更多相关文章

  1. 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. [CTF]维吉尼亚密码(维基利亚密码)

    [CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...

  3. Vigenère Cipher 维吉尼亚加解密算法

    维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c+ ...

  4. 维吉尼亚密码-攻防世界(shanghai)

    维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...

  5. python 维吉尼亚

    加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...

  6. 维吉尼亚密码java代码实现根据密钥长度计算IC值过程

    package cn.longxuzi; import java.util.Scanner; import org.junit.Test; public class ICUtils { /** * @ ...

  7. 维吉尼亚密码java完整版

    package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...

  8. python实现维吉尼亚解密

    # -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXR ...

  9. 【福吧资源网整理】老男孩-python运维6期 不加密

    老男孩-python运维6期 不加密,连夜整理出来分享给大家老男孩的python教程确实不错. 教程目录: 下载地址:http://www.fu83.cn/thread-204-1-1.html  

随机推荐

  1. Docker容器如何互联

    容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式. 该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息. 自定义容器命名 连接系统依据容器的名称来执 ...

  2. SMON功能-SMON_SCN_TIME字典基表

    SMON后台进程的作用还包括维护SMON_SCN_TIME基表. SMON_SCN_TIME基表用于记录过去时间段中SCN(system change number)与具体的时间戳(timestamp ...

  3. java创建线程

    创建一个线程 Java提供了两种创建线程方法: 通过实现Runable接口: http://blog.csdn.net/duruiqi_fx/article/details/52187275 通过继承 ...

  4. 剑指Offer——完美+今日头条笔试题+知识点总结

    剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...

  5. Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)

    csdn :码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51958010 RetrofitClient 基于Retrofit2 ...

  6. JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”

    摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...

  7. 指令汇B新闻客户端开发(三) 下拉刷新

    现在我们继续这个新闻客户端的开发,今天分享的是下拉刷新的实现,我们都知道下拉刷新是一个应用很常见也很实用的功能.我这个应用是通过拉ListView来实现刷新的,先看一张刷新的原理图 从图中可知,手指移 ...

  8. iOS7编程Cookbook中例15.8中一个小问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该书的15.8例子标题为Editing Videos on a ...

  9. Erlang 集群互连测试

    Erlang 集群互连测试Erlang节点相同cookie全互联成为一个集群(cluster).如果2个集群不同cookie, 然后其中有节点连接到对方集群的节点,这2个集群会合并成一个集群吗?连接到 ...

  10. 在javascript里 string 和 int 类型转换

    string 转换为int 类型 (1)tostring()方法 var   x=10    a   =   x.toString() //输出为string类型 alert(typeof(a)); ...