网络安全-古典加密算法之置换密码加解密算法
置换密码
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为attack begins atfive,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式:
根据密钥 cipher 中各字母在字母表中出现的先后顺序,给定一个置换:
根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列,第 2 列,第 6 列的顺序排列,则有下面形式:
根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列,第 2 列,第 6 列的顺序排列,则有下面形式:
从而得到密文: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;
}
加密:
解密: