维吉尼亚的加解密有两种方法。

第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文


第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符。

本文要用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 维吉尼亚加解密算法的更多相关文章

  1. [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

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

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

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

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

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

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

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

  5. python实现维吉尼亚解密

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

  6. python 维吉尼亚

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

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

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

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

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

  9. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

随机推荐

  1. ubuntu下MySQL安装配置及基本操作

    在linux下安装方法: 分为四种:一: 直接用软件仓库自动安装(如:ubuntu下,sudo apt-get install mysql-server; Debain下用yum安装): 二:官网下载 ...

  2. hdu How many integers can you find

    题意:找出小于n是m个数每个数的倍数的数的个数. 思路:用二进制表示是那几个数的倍数. 二进制进行容斥,去掉小于0的数. #include <cstdio> #include <cs ...

  3. android 多线程断点续传下载

    今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  4. Android自定义控件 开源组件SlidingMenu的项目集成

    在实际项目开发中,定制一个菜单,能让用户得到更好的用户体验,诚然菜单的样式各种各样,但是有一种菜单——滑动菜单,是被众多应用广泛使用的.关于这种滑动菜单的实现,我在前面的博文中也介绍了如何自定义去实现 ...

  5. flex中validateall()方法, 多Item验证 ,结果统一提示

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  6. POJ1125 Stockbroker Grapevine(最短路)

    题目链接. 分析: 手感不错,1A. 直接穷举的起点, 求出不同起点到其它点最短路中最长的一条的最小值(好绕). #include <iostream> #include <cstd ...

  7. Hot to get clicked cell column in DevExpress XtraGrid

    To accomplish this task, use the GridView.RowCellClickevent. Please note that this event will not fi ...

  8. rails console --sandbox出现的安装错误解决方案

    rails中可以用使用console命令行来测试运行rails应用程序,但是采用源码编译安装的话可能缺少readline动态库,导致ruby无法使用这个库此时如果调用rails console(rai ...

  9. 尚学堂 JAVA Day3 概念总结

    java中的运算符 1.算术运算符 + - * / % Arithmetic operators + 运算符有三种身份 Additive Operator 1)加法:如 a + b; 2)连接:如 “ ...

  10. F - Truck History - poj 1789

    有一个汽车公司有很多年的汽车制造历史,所以他们会有很多的车型,现在有一些历史学者来研究他们的历史,发现他们的汽车编号很有意思都是有7个小写字母组成的,而且这些小写字母具有一些特别的意义,比如说一个汽车 ...