浅析加密算法二Vigenere密码
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析加密算法二Vigenere密码相关的知识,希望对你有一定的参考价值。
文章目录
一、简介
维吉尼亚密码(又译 维热纳尔密码 )是使用一系列凯撒密码组成密码字母表的加密算法,属于 多表密码 的一种简单形式。
维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso
)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso
)中。然而,后来在19世纪时被误传为是法国外交官布莱斯·德·维吉尼亚(Blaise De Vigenère
)所创造,因此现在被称为“维吉尼亚密码”。
维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable
)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。
二、原理
Vigengere
密码使用一个词组作为密钥,第一个密钥字母加密明文的第一个字母,第二个密钥字母加密明文的第二个字母,等所有密钥字母使用完后,密钥又再循环使用。
- 第一步可以先将密钥的长度拓展到(或者缩减到)和明文 长度一样
- 第二步开始加密,加密的方式一般分为两种
- ①公式加密
- ②查表加密
2.1 公式加密
对于第一个公式加密,我们可以如下操作:
加密:
C
i
=
P
i
+
K
i
(
m
o
d
26
)
C_i = P_i + K_i (mod \\ 26)
Ci=Pi+Ki(mod 26)
解密:
P
i
=
C
i
−
K
i
(
m
o
d
26
)
P_i = C_i - K_i (mod \\ 26)
Pi=Ci−Ki(mod 26)
其中的
C
i
C_i
Ci 表示的是密文的第
i
i
i 个字母,
P
i
P_i
Pi 表示的是明文的第
i
i
i 个字母,
K
i
K_i
Ki 表示的是密钥的第
i
i
i 个字母
例如:
P = vigenere
K = key
(a的位置对应的是0,其余的以此类推)
得到:
P i P_i Pi | v | i | g | e | n | e | r | e |
---|---|---|---|---|---|---|---|---|
K i K_i Ki | k | e | y | k | e | y | k | e |
C i C_i Ci | f | m | e | o | r | c | a | i |
2.2 查表加密
对于每一种加密我们在一个字母表中找到我们 P i P_i Pi 和 K i K_i Ki 对应的 C i C_i Ci 即可,我们可以先用一个二维数组来存储这个字母表,然后我们将每一个字母转化为一个数字,作为查找的下标,然后就能轻松的实现加密的过程,解密的话就反过来就好
例如:
给定字母表:
给出查询的明文 SWPUACM
然后给出密钥:MANGATA
那么我们就能构造出来
P i P_i Pi | S | W | P | U | A | C | M |
---|---|---|---|---|---|---|---|
K i K_i Ki | M | A | N | G | A | T | A |
C i C_i Ci | E | W | C | A | A | V | M |
三、例题
题目链接: http://acm.mangata.ltd/p/P2030
四、代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 26
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
void Vigenere(string P,string K)
string C = "";
int len1 = P.size(),len2 = K.size();
for(int i = 0; i < len1; ++i)
int pos = ((P[i]-'A') + (K[i % len2] - 'A')) % mod;
C += char('A' + pos);
cout<<"The Vigenere ciphertext = "<<C<<endl;
int main()
string P,K;
cout<<"Please input the plaintext"<<endl;//Encryption key
cin>>P;
cout<<"Please input the Encryption key"<<endl;
cin>>K;
transform(P.begin(),P.end(),P.begin(), ::toupper);
transform(K.begin(),K.end(),K.begin(), ::toupper);
Vigenere(P,K);
return 0;
以上是关于浅析加密算法二Vigenere密码的主要内容,如果未能解决你的问题,请参考以下文章