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

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


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

本文要用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. Altera quartus II遇到的问题

    编译时提示: Warning (13024): Output pins are stuck at VCC or GND Warning (13410): Pin "SCLK" is ...

  2. 转:MySQL导入.sql文件及常用命令

    在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令: mysql> source   d:/myprogram ...

  3. InstallShield FEQ

    Q: 如何替换setup.exe的图标? A: 这不是一个推荐的操作,因为可能会引起不可预见的错误,而且IS没有开放这个接口.如果你坚持要这么做,可以使用第三方软件比如ExeScope来进行图标替换. ...

  4. [转]C# FileSystemWatcher监控指定文件或目录的文件的创建、删除、改动、重命名等活动

    觉得这个很常用..比如一些软件.   http://www.rabbit8.cn/DoNet/407.html   FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删 ...

  5. C51-keil编译常见错误和警告处理53

    keil错误:C51编译器识别错类型有三种:1.致命错误:伪指令控制行有错,访问不存在的原文:2.语法及语义错误:语法和语义错误都发生在原文件:3.警告:警告出现并不影响目标文件的产生,但执行:C_5 ...

  6. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  7. 初学Android开发怎么开始?

    在几个Android开发者群里面总是碰到新人提出这样的问题:"我想学Android开发,但是不知道怎么开始,不知道要学一些什么."  其实,我在最开始学习Android开发的时候也 ...

  8. How to make onActivityResult get called on Nested Fragment

    One of the common problem we always meet in the world of Fragment is: although we could callstartAct ...

  9. Tomcat内存溢出详解【转载】

    本文转载自 http://elf8848.iteye.com/blog/378805 Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryEr ...

  10. 利用"NOTIFYICONDATA"实现MFC的托盘程序

    本文章为转发百度空间内容,,保存一下,以防以后用到.. 一.自定义信息 在头文件中加入下面这句话: #define WM_SHOWTASK (WM_USER+1) 二.MYDLG.CPP文件中添加_m ...