一門研究設計密碼算法和破譯密碼算法的綜合性技術科學,是網絡空間安全學科中理論體系最完善的一門科學,也是信息安全的基石。密碼學一般由密碼編碼和密碼分析兩大分支組成。ios
從密碼學的發展歷史來看,能夠分爲古典密碼學和現代密碼學。c++
古典密碼學
主要依靠人工計算和簡單的機械,而且以人的主觀意識來設計和應用。古典加密算法每每只是對單個的代替或置換操做。git
現代密碼學…web
置換密碼就是把明文中的字母或數字從新排列,字母或數字自己不變,但其位置發生了改變,示例以下:算法
明文: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; }