网络安全-古典加密算法之置换密码加解密算法

置换密码

置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为attack begins atfive,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式:
1
根据密钥 cipher 中各字母在字母表中出现的先后顺序,给定一个置换:
2
根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列,第 2 列,第 6 列的顺序排列,则有下面形式:
根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列,第 2 列,第 6 列的顺序排列,则有下面形式:
3
从而得到密文:abatgftetcnvaiikse
其解密的过程是根据密钥的字母数作为列数,将密文按照列,行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

代码:

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
void encrypt() {
	string m;
	cout<< "请输入明文:" <<endl;
	cin>> m;
	for (int i = m.size(); i%7!=0; i++)
	{
		m.push_back('A');
	}
	for (int i = 0; i < m.size(); i+=7)
	{
		swap(m[i], m[i+2]);
		swap(m[i], m[i+6]);
		swap(m[i], m[i+3]);
		swap(m[i], m[i+0]);
		swap(m[i], m[i+5]);
		swap(m[i], m[i+1]);
		swap(m[i], m[i+4]);
	}
	cout<<"加密后密文为:"<<endl;
	for (int i = 0; i < m.size(); i++)
	{
		if(i!=0 && i%7==0)
			cout<<endl;
		cout<<m[i];		
	}
	cout<<endl;
}
void decrypt() {
	string m;
	cout<<"请输入密文:"<<endl;
	cin>>m;
	for(int i=0;i<m.size();i+=7) {
		swap(m[i], m[i+4]);
		swap(m[i], m[i+1]);
		swap(m[i], m[i+5]);
		swap(m[i], m[i+0]);
		swap(m[i], m[i+3]);
		swap(m[i], m[i+6]);
		swap(m[i], m[i+2]);
	}
	cout<<"明文为:"<<endl;
	for (int i = 0; m[i]!='A'; i++)
	{
		cout<<m[i];
	}
	cout<<endl;
}
int main()
{
	int x;
	cout<<"1.加密 2.解密"<<endl;
	cin>>x;
	switch(x) {
		case 1:encrypt(); break;
		case 2:decrypt(); break;
		default: break;
	}
	return 0;
}

加密:
3
解密:
4

猜你喜欢

转载自blog.csdn.net/xu_benjamin/article/details/87874271