Vigenère Cipher 维吉尼亚加解密算法
维吉尼亚的加解密有两种方法。
第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文

第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符。
本文要用c++实现第二种方法,并且为了操作方便,使用了MFC框架(附工程下载)
核心代码如下:
//cipher.h 额外添加的文件,用来放置相关算法,此文件独立于MFC外,可直接移植到支持CString的项目中
int* CStringToInt(CString str){
//将CString转换为zero_based整数
int size=str.GetLength();
int *asc_space=new int[size];//使用new为了返回时不被消除
for (int i=;i<size;i++)
{
asc_space[i]=int(str.GetAt(i));
if(asc_space[i]>&&asc_space[i]<) //A-Z转化
asc_space[i]-=;
else if(asc_space[i]>&&asc_space[i]<) //a-z转化
asc_space[i]-=;
}
return asc_space;
} void Encode(CString key,CString plain,CString &cipher){
//维吉尼亚加密算法
int *keycode=CStringToInt(key);
int *plaincode=CStringToInt(plain);
int *ciphercode=CStringToInt(plain);
int keysize=key.GetLength();
int plainsize=plain.GetLength();
int flag=;
CString blank(' ',plainsize+); //预留一个字节放\0
cipher=blank; //生成空白的密文
for (int i=;i<plainsize;i++)
{
if(flag>=keysize) //轮换钥匙
flag=;
ciphercode[i]=(plaincode[i]+keycode[flag])%; //求密文的数字码
cipher.SetAt(i,'A'+ciphercode[i]); //生成密文
++flag;
}
cipher.SetAt(i,'\0'); //在末尾放入\0
delete keycode,plaincode,ciphercode;//释放CStringToInt()申请的空间
} void Decode(CString key,CString &plain,CString cipher){
//加密稍作修改就是解密算法
int *keycode=CStringToInt(key);
int *plaincode=CStringToInt(cipher);
int *ciphercode=CStringToInt(cipher);
int keysize=key.GetLength();
int ciphersize=cipher.GetLength();
int flag=;
CString blank(' ',ciphersize+);
plain=blank;
for (int i=;i<ciphersize;i++)
{
if(flag>=keysize)
flag=;
//+26是为了对密文数字码小于密钥数字码的情况进行矫正
plaincode[i]=(ciphercode[i]-keycode[flag]+)%;
plain.SetAt(i,'a'+plaincode[i]);
++flag;
}
plain.SetAt(i,'\0');
delete keycode,plaincode,ciphercode;
}
//MFC OnButton()响应
void CVigenereCipherDlg::OnEncrypt() //加密按钮
{
UpdateData();
if(m_key.IsEmpty()||m_plain.IsEmpty())
MessageBox("密钥及明文不能为空!");
else{
Encode(m_key,m_plain,m_cipher);//调用加密函数
UpdateData(false);
m_ctrEDIT1.SetReadOnly(TRUE);//防止修改密钥
m_ctrEDIT2.SetReadOnly(TRUE);//防止修改明文
m_ctrEDIT3.SetReadOnly(TRUE);//防止修改密文
m_ctrEDIT4.SetReadOnly(FALSE);
}
} void CVigenereCipherDlg::OnDecrypt() //解密按钮
{
UpdateData();
if(m_key.IsEmpty()||m_cipher.IsEmpty())
MessageBox("密钥及密文不能为空!");
else{
Decode(m_key,m_explainted,m_cipher);
UpdateData(false);
m_explainted="";
m_ctrEDIT1.SetReadOnly(FALSE);
m_ctrEDIT2.SetReadOnly(FALSE);
m_ctrEDIT3.SetReadOnly(FALSE);
m_ctrEDIT4.SetReadOnly(TRUE);
}
}
测试结果如下图:

工程下载链接:
http://files.cnblogs.com/zoffy/VigenereCipher.zip
Vigenère Cipher 维吉尼亚加解密算法的更多相关文章
- [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- [CTF]维吉尼亚密码(维基利亚密码)
[CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...
- 维吉尼亚密码-攻防世界(shanghai)
维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...
- python实现维吉尼亚解密
# -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXR ...
- python 维吉尼亚
加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...
- 维吉尼亚密码java代码实现根据密钥长度计算IC值过程
package cn.longxuzi; import java.util.Scanner; import org.junit.Test; public class ICUtils { /** * @ ...
- 维吉尼亚密码java完整版
package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
随机推荐
- 调试器带参数调试(OD,EDB)
小东西,不要在意这些细节-- OD带参数比较简单: 文件-- 打开 -- 在最下面有一个参数 KALI LINUX下的EDB 命令格式为 edb –run "对应程序路径" ...
- poj 3308 Paratroopers
http://poj.org/problem?id=3308 #include <cstdio> #include <cstring> #include <algorit ...
- BZOJ 3065 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 思路:替罪羊树套权值线段树. 当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂 ...
- HDU Train Problem I 1022 栈模拟
题目大意: 给你一个n 代表有n列 火车, 第一个给你的一个字符串 代表即将进入到轨道上火车的编号顺序, 第二个字符串代表的是 火车出来之后到顺序, 分析一下就知道这,这个问题就是栈, 先进后出吗, ...
- Windows 7 中未能从程序集System.ServiceModel
Windows 7 中未能从程序集System.ServiceModel “/”应用程序中的服务器错误. 未能从程序集“System.ServiceModel, Version=3.0.0.0 ...
- 计算机语言的发展(the history of computer's language)
第一部分 计算机语言的分类: 机器语言:直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码.例如:1011011000000000,表示加法.可以直接执行. 汇编语言:汇编指令集.伪指 ...
- Java---IO加强(3)-IO流的操作规律
一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的 ...
- 大暴力——[HAOI]2012音量调节
题目:[HAOI]2012音量调节 描述: 问题描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里 ...
- 利用Jenkins自动部署工具间接构建kettle的调度平台
关于Jenkins的介绍我就不说了,自己百度,因为这个工具调用脚本只是他的功能的冰山一角,其他功能我也不能理解,因为不是那个领域. 下面我就介绍一下为什么我们需要一个调度平台,以及学习完 ...
- css 改变scroll样式
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; height: 16px; background-color: #F5 ...