C++ 矩阵置换密码的具体实现

  • 置换密码
    置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码也叫换位密码。它的加密方法是将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。例如,明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 个字母的形式排在矩阵中,如下形式:
a t t a c k
b e g i n s
a t f i v e

根据密钥 cipher 中各字母在字母表中出现的先后顺序,给定一个置换:

1 4 5 3 2 6
1 2 3 4 5 6

根据上面的置换,将原有矩阵中的字母按照第 1、4、5、3、2、6 的顺序排列,则有下列形式:

 a a c t t k 
 b i n g e s
 a i v f t e

从而得到密文:aacttkbingesaivfte

  • 具体代码
#include<bits/stdc++.h>
using namespace std;
void encrypt(){
	string key, plain;
	cout << "请输入明文(不需要输入间隔):\n";
	cin >> plain;
	cout << "请输入密钥:\n";
	cin >> key;
	int l;
	l = plain.size() / key.size();
	char a='a';
	for (int i = plain.size(); i % key.size() != 0; i++)
	{
		plain.push_back(a++);//通过判断在明文数组后面补齐
	}
	cout << endl;

	cout<<"明文矩阵"<<endl;
	for (int i = 0; i < plain.size(); i++)//输出列宽为密钥长度的矩阵
	{
		cout << plain[i]<<" ";
		if (i % key.size() == key.size()-1)
		{
			cout << "\n";
		}
	}
	cout<<endl;
	cout<<"密钥排序数组:"<<endl;
	vector<int>v(key.size(),0);//密钥排序数组
	int count=0;
	for(int i=0;i<key.size();i++){
		for(int j=0;j<key.size();j++){
			if(key[i]>key[j]){
				count++;
			}
		}
		v[i]=count;
		count=0;
	}
	for(int i=0;i<v.size();i++){
		cout<<v[i]+1<<" ";
	}
	cout<<endl;

	cout << "\n排序后:"<<endl;
	string temp=plain;
	for (int i = 0; i < key.size(); i++){
		for (int k = 0; k <= l; k++){
			plain[i+k*key.size()]=temp[v[i]+k*key.size()];
		}
	}
	for (int i = 0; i < plain.size(); i++)//输出列宽为密钥长度的矩阵
	{
		cout << plain[i]<<" ";
		if (i % key.size() == key.size()-1)
		{
			cout << "\n";
		}
	}
	cout<<endl;
	cout<<"密文:"<<plain<<endl;
}
void decrypt(){
	string key, plain;
	cout << "请输入密文:\n";
	cin >> plain;
	cout << "请输入密钥:\n";
	cin >> key;
	int l;
	l = plain.size() / key.size();
	cout<<endl;
	cout<<"密文矩阵"<<endl;
	for (int i = 0; i < plain.size(); i++)//输出列宽为密钥长度的矩阵
	{
		cout << plain[i]<<" ";
		if (i % key.size() == key.size()-1)
		{
			cout << "\n";
		}
	}
	cout<<endl;
	cout<<"密钥排序数组:"<<endl;
	vector<int>v(key.size(),0);//密钥排序数组
	int count=0;
	for(int i=0;i<key.size();i++){
		for(int j=0;j<key.size();j++){
			if(key[i]>key[j]){
				count++;
			}
		}
		v[i]=count;
		count=0;
	}
	for(int i=0;i<v.size();i++){
		cout<<v[i]+1<<" ";
	}
	cout<<endl;

	cout << "\n还原后:"<<endl;
	string temp=plain;
	for (int i = 0; i < key.size(); i++){
		for (int k = 0; k <= l; k++){
			plain[v[i]+k*key.size()]=temp[i+k*key.size()];
		}
	}
	for (int i = 0; i < plain.size(); i++)//输出列宽为密钥长度的矩阵
	{
		cout << plain[i]<<" ";
		if (i % key.size() == key.size()-1)
		{
			cout << "\n";
		}  
	}
	cout<<endl;
	cout<<"明文:"<<plain<<endl;
}
int main()
{
	int n=0;
    cout<<"置换密码"<<endl;
    cout<<"1.加密"<<endl;
    cout<<"2.解密"<<endl;
    cout<<"3.退出"<<endl;
    while(n!=3){
        cin>>n;
        switch (n)
        {
        case 1:
            encrypt();//加密
            cout<<"请继续选择功能"<<endl;
            break;
        case 2:
            decrypt();//解密
            cout<<"请继续选择功能"<<endl;
            break;
        case 3:
            n=3;
            break;
        default:
            cout<<"输入错误,请重新输入!"<<endl;
            break;
        }
    }
    system("pause");
    return 0;
}

  • 运行结果

加密解密

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
栅栏密码是一种简单的置换密码,它的加密解密过程如下: 加密: 1. 将明文按照规定的栅栏高度分成若干个组,每组长度为栅栏高度。 2. 将每一组中的字符按照顺序排列,形成密文。 解密: 1. 将密文按照规定的栅栏高度分成若干个组,每组长度为栅栏高度。 2. 将每一组中的字符按照规定的顺序排列,形成明文。 下面是使用 C++ 实现栅栏密码加密解密的代码: ```cpp #include <iostream> #include <string> using namespace std; // 加密函数 string encrypt(string plain_text, int height) { int length = plain_text.length(); int width = (length + height - 1) / height; char matrix[height][width]; int index = 0; for (int j = 0; j < width; j++) { for (int i = 0; i < height; i++) { if (index < length) { matrix[i][j] = plain_text[index]; index++; } else { matrix[i][j] = ' '; } } } string cipher_text = ""; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { cipher_text += matrix[i][j]; } } return cipher_text; } // 解密函数 string decrypt(string cipher_text, int height) { int length = cipher_text.length(); int width = (length + height - 1) / height; char matrix[height][width]; int index = 0; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (index < length) { matrix[i][j] = cipher_text[index]; index++; } else { matrix[i][j] = ' '; } } } string plain_text = ""; index = 0; for (int j = 0; j < width; j++) { for (int i = 0; i < height; i++) { if (matrix[i][j] != ' ') { plain_text += matrix[i][j]; index++; } if (index >= length) { break; } } if (index >= length) { break; } } return plain_text; } int main() { string plain_text = "Hello World!"; int height = 3; string cipher_text = encrypt(plain_text, height); cout << "Cipher Text: " << cipher_text << endl; string decrypted_text = decrypt(cipher_text, height); cout << "Decrypted Text: " << decrypted_text << endl; return 0; } ``` 上面的代码中,`encrypt` 函数实现了栅栏密码的加密过程,`decrypt` 函数实现了栅栏密码的解密过程。在 `main` 函数中,我们先定义了明文和栅栏高度,然后调用 `encrypt` 函数进行加密,再调用 `decrypt` 函数进行解密。运行程序,输出如下: ``` Cipher Text: Horel ollWd! Decrypted Text: Hello World! ``` 可以看出,栅栏密码加密解密成功。需要注意的是,如果明文的长度不能被栅栏高度整除,我们需要在矩阵中填充空格。在解密过程中,需要注意去除填充的空格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值