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

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


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

本文要用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. 一个关于多线程和DbHelper的问题

    我的初衷是这样的:在多线程环境下,每个数据库编号对应一个DbHelper对象. 下面是代码,不知道这样写有什么问题. namespace TestDAL { public class DB { pri ...

  2. [转载] $\mathrm{Jordan}$标准型的介绍

    本文转载自陈洪葛的博客$,$ 而实际上来自xida博客朝花夕拾$,$ 可惜该博客已经失效 $\mathrm{Jordan}$ 标准形定理是线性代数中的基本定理$,$ 专门为它写一篇长文好像有点多余$: ...

  3. 自己动手学TCP/IP–http协议(http报文头)

    在前面的一篇文章中,简单了介绍了HTTP报文格式,详情参考http://www.firefoxbug.net/?cat=47. 这里大概介绍下基本的,常见的HTTP包头格式. POST /report ...

  4. mysql 安装截图

    这里有3个选项, 1.Developer Machine(开发机器),个人用桌面工作站,占用最少的系统资源 2.Server Machine(服务器),MySQL服务器可以同其它应用程序一起运行,例如 ...

  5. 跑马灯js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. g++ gcc 的区别

    我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ext ...

  7. 【转】C#读取文件时的共享方式

    string sFileName = @"C:\Exchange.dat";System.IO.StreamReader file = new System.IO.StreamRe ...

  8. mvc系统过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  9. Android学习–Android app 语言切换功能

    功能: app用户根据自己的语言喜好,设置app语言.语言设置只针对本app,并在下次启动应用时保留前一次启动设置. 更新语言: public static void changeAppLanguag ...

  10. HNC-局部联想脉络

    局部联想脉络 概念分为:抽象概念.具体概念 对抽象概念用 五元组 和 语义网络 表达 对具体概念用 挂靠展开近似 表达 五元组:动态.静态.属性.值.效应.(u,g,u,z,r),用于表达抽象概念的外 ...