信息安全——维吉尼亚密码算法(C++实现)

信息安全导论课程学习的实验一,维吉尼亚密码算法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;
}

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值