密碼安全之密碼技術【1】置換密碼

密碼學

一門研究設計密碼算法和破譯密碼算法的綜合性技術科學,是網絡空間安全學科中理論體系最完善的一門科學,也是信息安全的基石。密碼學一般由密碼編碼和密碼分析兩大分支組成。ios

從密碼學的發展歷史來看,能夠分爲古典密碼學現代密碼學c++

古典密碼學

主要依靠人工計算和簡單的機械,而且以人的主觀意識來設計和應用。古典加密算法每每只是對單個的代替或置換操做。git

現代密碼學…web

  1. 置換密碼

置換密碼就是把明文中的字母或數字從新排列,字母或數字自己不變,但其位置發生了改變,示例以下:算法

明文:this is transposition cipher
密文:rehp ic noitisopsnart sisiht

本例是一種直接將明文按倒序排列的簡單置換加密算法,可被直接分析,進一步將明文按必定順序排成一個矩陣,而後按置換規則的順序選出矩陣中的字母序列,最後按固定長度讀取字母即造成密文。安全

原始明文:this is transposition cipher

在這裏插入圖片描述
置換規則:按列讀取網絡

造成密文:tiao ii rhsnsopitsinh srptce

由此看出改變矩陣的大小和置換規則能夠獲得不一樣形式的密碼,一般咱們先選定一個詞語做爲密鑰,去掉重複字母而後按字典順序給密鑰字母一個數字編號,就能夠獲得一組與密鑰對應的數字序列,最後以此序列做爲置換規則選出密文。svg

明文:this is transposition cipher
詞語密鑰:password

根據詞語密鑰獲得數字序列爲:4167352
排成矩陣:
在這裏插入圖片描述
根據序列獲得密文:ssor tr ipsoctsiiniei pnhathui

置換密碼是一種經過變換矩陣大小選出的順序組合,而密鑰僅僅是便於記憶,所以,置換密碼比較簡單,經不起窮舉攻擊(窮舉攻擊無視順序),但能夠把此種方法與其餘密碼結合能夠獲得相對安全且高效的密碼。
.
.
.
而後我用c++實現了加密的過程【望指正!!!】this

#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
using namespace std;
int main() {
	cout << "Enter the characters you need to encrypt and the key:";
	string characters,key;
	cin >> characters >> key;
	int len_c = characters.length();
	int len_k = key.length();
	int row = len_c / len_k + 1;
	int column = len_k;
	if (len_c != 0 && len_k != 0) {
		vector<char> matrix;
		for (int i = 0; i < len_c; i++) {
			char *p_c = &characters[0];
			if (p_c != " ") {
				matrix.push_back(*p_c);
			}
			p_c++;
		}
		//De - weighting and sort
		set<char> digital_sequence;
		char *p_k = &key[0];
		for (int j = 0; j < len_k; j++,p_k++)
			digital_sequence.insert(*p_k);
		//Build key - value pairs
		map<char, int> encrypt;
		int key_temp = 1;
		for (int k = 0; k < len_k; k++, key_temp++)
			encrypt.insert(pair<char, int>(digital_sequence.count[k],key_temp));
		string encrypt_result;
		for (char it : key) {
			int column_part = encrypt.at(it);
			for (int row_part = 0; row_part < row; row_part++) {
				if (matrix[column_part - 1 + row_part * column] != NULL)
					encrypt_result += matrix[column_part - 1 + row_part * column];
			}
		}
		cout << "Encrypted character:" << encrypt_result << endl;
	}
	else {
		cout << "Possible input may be incorrect, please re-enter^_^";
	}
	return 0;
}
相關文章
相關標籤/搜索