密码学
一门研究设计密码算法和破译密码算法的综合性技术科学,是网络空间安全学科中理论体系最完善的一门科学,也是信息安全的基石。密码学通常由密码编码和密码分析两大分支组成。
从密码学的发展历史来看,可以分为古典密码学和现代密码学。
古典密码学
主要依靠人工计算和简单的机械,并且以人的主观意识来设计和应用。古典加密算法往往只是对单个的代替或置换操作。
现代密码学…
- 替代密码
替代密码的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文,例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码,多明码替代密码,多字母替代密码,多表替代密码等
凯撒密码
又称循环移位密码,是一种典型的单表替代密码,它的加密方法就是将明文中的每个字母用此字符在字母表中后面第k个字母替代,加密过程可以表示为:
E(m) = (m+k) mod n
【其中,m为明文字母在字母表中的位置数,n为字母表中的字母个数,k为密钥,E(m)为密文字母在字母表中对应的位置数,mod n为取模运算。】
由于是对名文字母进行统一的偏移代替,因此密钥极易被穷举破解,为了提高破解难度,多表代替密码则是在加解密时使用了多个替换表,代表性算法有维吉尼亚密码,希尔密码,一次一密钥密码,Playfair密码等。
维吉尼亚密码
该密码体制有一个参数 n ,在加解密时,同样把英文字母映射为 0~25 的数字再进行运算,并按 n 个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为 n 的英文字母串的集合,加密体制描述如下:
加密变换定义为:设密钥 k = (k1,k2,...,kn),明文 m = (m1,m2,...,mn), 密文 c = (c1,c2,...,cn).
加密变换:Ek(m) = (c1,c2,...,cn), 其中,ci = (mi+ki) mod 26, i=1,2,...,n.
解密算法:Dk(m) = (m1,m2,...,mn), 其中,mi = (ci-ki) mod 26, i=1,2,...,n.
以下分别是对两种加密方式的实现{后者包含了解密操作}【望指正】!!!
#include<iostream>
#include<map>
#include<string>
#define n 26
using namespace std;
template<typename _MapType>
auto get_map_key_value(const _MapType& input_map, const decltype(input_map.begin()->second)& mapped_value) -> decltype(input_map.begin()->first)
{
auto iter = std::find_if(input_map.begin(), input_map.end(), [mapped_value](const auto& item) {
return (item.second == mapped_value);
});
if (iter == input_map.end())
{
return decltype(input_map.begin()->first)();
}
return iter->first;
}
static map<char, int> Alphabetic_query = {
{'a',1},{'b',2},{'c',3},{'d',4},
{'e',5},{'f',6},{'g',7},{'h',8},
{'i',9},{'j',10},{'k',11},{'l',12},
{'m', 13},{'n',14},{'o',15},{'p',16},
{'q',17},{'r',18},{'s',19}, {'t',20},
{'u',21},{'v',22},{'w',23},{'x',24},
{'y',25},{'z',26}
};
int main() {
cout << "THE FIRST METHOD CALLED Caesar PASSWORD" << endl;
cout << "Enter the characters you need to encrypt and the key:";
string characters,Enc_password;; char key, *position;
int bridge_key, bridge_characters;
cin >> characters >> key;
if (characters.length() != NULL && key != NULL) {
position = &characters[0];
if (key >= 65 && key <= 90) bridge_key = Alphabetic_query.at(key + 32);
else bridge_key = Alphabetic_query.at(key);
while (position != NULL) {
if ((*position) >= 65 && (*position) <= 90)
bridge_characters = Alphabetic_query.at(*position + 32);
else bridge_characters = Alphabetic_query.at(*position);
Enc_password += Caesar(bridge_characters, bridge_key);
position++;
}
}
cout << "Encrypted character" << Enc_password << endl;
}
char Caesar(int m,int k) {
return get_map_key_value(Alphabetic_query, (m + k) % n);
}
#include<iostream>
#include<map>
#include<string>
#define n 26
using namespace std;
template<typename _MapType>
auto get_map_key_value(const _MapType& input_map, const decltype(input_map.begin()->second)& mapped_value) -> decltype(input_map.begin()->first)
{
auto iter = std::find_if(input_map.begin(), input_map.end(), [mapped_value](const auto& item) {
return (item.second == mapped_value);
});
if (iter == input_map.end())
{
return decltype(input_map.begin()->first)();
}
return iter->first;
}
static map<char, int> Alphabetic_query = {
{'a',1},{'b',2},{'c',3},{'d',4},
{'e',5},{'f',6},{'g',7},{'h',8},
{'i',9},{'j',10},{'k',11},{'l',12},
{'m', 13},{'n',14},{'o',15},{'p',16},
{'q',17},{'r',18},{'s',19}, {'t',20},
{'u',21},{'v',22},{'w',23},{'x',24},
{'y',25},{'z',26}
};
string characters, Enc_password, key; char *position_c, *position_k;
int bridge_key, bridge_characters;
bool flag;
int main() {
cout << "THE SECOND METHOD CALLED Virginia password" << endl;
cout << "Enter the characters you need to encrypt and the key:";
cin >> characters >> key;
string result_e = Virginia_add(characters, key);
cout << "Encrypted character" << result_e << endl;
string result_u = Virginia_solution(result_e,key);
cout << "Unencrypted character" << result_u << endl;
}
string transform(string &characters,string &key,bool flag) {
if (characters.length() != NULL && key.length() != NULL && characters.length() == key.length()) {
position_c = &characters[0];
position_k = &key[0];
while (position_c != NULL && position_k != NULL) {
if (*position_k >= 65 && *position_k <= 90) bridge_key = Alphabetic_query.at(*position_k + 32);
else bridge_key = Alphabetic_query.at(*position_k);
if ((*position_c) >= 65 && (*position_c) <= 90) bridge_characters = Alphabetic_query.at(*position_c + 32);
else bridge_characters = Alphabetic_query.at(*position_c);
if(flag==true) Enc_password += Virginia(bridge_characters, bridge_key);
else Enc_password += Virginia(bridge_characters, bridge_key);
*position_c++; *position_k++;
}
}
return Enc_password;
}
char Virginia(int m, int k) {
return get_map_key_value(Alphabetic_query, (m + k) % n);
}
char Unvirginia(int m, int k) {
return get_map_key_value(Alphabetic_query, (m - k) % n);
}
string Virginia_add(string &characters, string &key){
return transform(characters, key,1);
}
string Virginia_solution(string &result,string &key) {
return transform(result, key,0);
}