信息安全导论课程学习的实验一,维吉尼亚密码算法C++的实现。
维吉尼亚密码算法是一种代换密码算法,直观上来说,密钥一般短于明文长度,因此加密时需要将明文根据密钥长度进行分组,每一组明文根据密钥对应(0-25)进行移位;
以下是具体原理:
【原理】
1) 算法原理
a) Vigenere密码是由法国密码学家Blaise de Vigenere于1858年提出的一种代换密码,它是多表代换密码的典型代表。
b) 定义:设m为某一固定的正整数,P、C和K分别为明文空间、密文空间和密钥空间,并且P=K=C=(Z26)m,对一个密钥k=(k1,k2,…,km),定义维吉尼亚密码的加解密算法如下:
Vigenere密码加密算法: ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)
Vigenere密码解密算法: dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。
其中k=(k1,k2,…,km)是一个长为m的密钥字,密钥空间的大小为26m,所以对一个相对小的m,穷举密钥也需要很长的时间。如m=7,则密钥空间大小超过8×109,所以手工搜索非常困难。当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。
2) 算法参数
Vigenere密码算法主要有c、m、k三个个参数。c为密文,m是明文,k为密钥。
维吉尼亚密码算法也较为简单,因此直接通过代码理解:
//vignere密码
#include<iostream>
#include<string>
using namespace std;
//加密
string encrypt(string m, string k)
{
string c = "";
int k_len = k.size(), m_len = m.size(), s = 0;
for (int i = 0; i < m_len; i++)
{
//其它字符
if (m[i] >= 'a' && m[i] <= 'z')
{
int j = (i - s) % k_len;
c += (m[i] - 'a' + k[j] - 'a') % 26 + 'a';
}
else if (m[i] >= 'A' && m[i] <= 'Z')
{
int j = (i - s) % k_len;
c += (m[i] - 'A' + k[j] - 'a') % 26 + 'A';
}
else
{
c += m[i];
s++;
}
}
return c;
}
//解密
string decrypt(string c, string k)
{
string m = "";
int k_len = k.size(), c_len = c.size(), s = 0;
for (int i = 0; i < c_len; i++)
{
//其它字符
if (c[i] >= 'a' && c[i] <= 'z')
{
int j = (i - s) % k_len;
m += (c[i] - 'a' + 26 - (k[j] - 'a')) % 26 + 'a';
}
else if (c[i] >= 'A' && c[i] <= 'Z')
{
int j = (i - s) % k_len;
m += (c[i] - 'A' + 26 - (k[j] - 'a')) % 26 + 'a';
}
else
{
m += c[i];
s++;
}
}
return m;
}
int main()
{
string m, k;
getline(cin, m);
getline(cin, k);
cout << encrypt(m, k) << endl;
cout << decrypt(encrypt(m, k), k) << endl;
return 0;
}