Vigenere
本文是对Vigenere算法及实现(c++)进行一个简单介绍~~
背景
在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso)中,有一种密码算法法名为Vigenere。
相比于传统的单表代换密码,Vigenere在密钥的选取和明文密文的映射上采用多表代换,即每一个明文符号都根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计(单表代换可以通过词频统计来进行密钥猜测,很容易破解)。从而极大地提高了算法的安全性。
Vigenere的安全上主要表现在以下两点:
(1)密钥长度越长,越难以破解,因为这是相当于对每一个字符分别进行加密。
(2)如果没有得到密钥,很难对密文进行解密(当然,在超短密钥情况下还是可能进行解密的)。
算法原理
算法原理在很多博客中介绍的还是不错的,也比较简单,下面简单从百科中看一下:
在Vigenere密码中,用户钥是一个有限序列,我们可以通过周期性(周期为d)将k扩展为无限序列,其中Ki=K(i mod d),1≤i≤,从而得到工作钥。
如果用Φ和θ分别表示密文和明文字母,则Vigenere密码的变换公式为:
Φ≡(θ+ki)(mod n)
该密码体制有一个参数n。在加解密时,同样把英文字母映射为0~25的数字再进行运算,并按凡个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合。
举例
这个例子也是来源于一个博客。
假如以上面第一行代表明文字母,左面第一列代表密钥字母(这个在原博客中我也没找到是什么意思),对如下明文加密:
TO BE OR NOT TO BE THAT IS THE QUESTION
(生存还是毁灭,这是个问题 ——哈姆雷特)
当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
密钥:RELAT IONSR ELATI ONSRE LATIO NSREL
明文:TOBEO RNOTT OBETH ATIST HEQUE STION
密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY
密码表
偶然间得到的一张效果图,感觉彩色很棒:
代码实现
网上各种语言实现加密解密的都有,这里我找了一个c++版本的,整个结构还是很棒的,另外就是加密和解密过程都有。
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
const int N=26;
char v[N][N]={
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}};
int number