1、凯撒密码:
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
char index[26];// 0~25 对应 a~z
map<char,int> M;//first存放字母,second存放字母在数组index中对应的下标
void init(){
for(int i=0;i<26;i++){
index[i]='a'+i;
M[index[i]]=i;
}
}
void PrintData(){
for(int i=0;i<26;i++)
cout<<index[i]<<" ";
cout<<endl;
map<char,int>::iterator it=M.begin();
while(it!=M.end()){
cout<<it->first<<" "<<it->second<<endl;
it++;
}
}
void CaesarEncoder(){
int k;
string m;
cout<<"Caesar凯撒加密系统"<<endl;
cout<<"请输入密钥k(k<=25):";
cin>>k;
cout<<"请输入明文:";
cin>>m;
int len=m.size();
for(int i=0;i<len;i++){
int pos=M[m[i]];
pos=(pos+k)%26;
m[i]=index[pos];
}
cout<<"对应密文为:"<<m<<endl;
}
void CaesarDecoder(){
int k;
string m;
cout<<"Caesar凯撒解密系统"<<endl;
cout<<"请输入密钥k(k<=25):";
cin>>k;
cout<<"请输入密文:";
cin>>m;
int len=m.size();
for(int i=0;i<len;i++){
int pos=M[m[i]];
pos=(pos-k)%26;
m[i]=index[pos];
}
cout<<"对应明文为:"<<m<<endl;
}
int main(int argc, char** argv) {
init();
// PrintData();
CaesarEncoder();
cout<<endl;
CaesarDecoder();
return 0;
}
2、Vigenere密码:
#include <iostream>
#include <string.h>
#include <map>
using namespace std;
char arr[26];
map<char,int> M;
char src[26][26];
string key;
string plain;
void init(){
for(int i=0;i<26;i++)
arr[i]='a'+i;
for(int i=0;i<26;i++){
char c='a'+i;
M[c]=i;
}
for(int i=0;i<26;i++){
char c='a'+i;//每行的起始字母
int pos=M[c];
for(int j=0;j<26;j++){
pos%=26;
src[i][j]=arr[pos];
pos++;
}
}
cout<<"=================Vigenere密码加密系统================="<<endl;
cout<<"请输入密钥:"<<endl;
cin>>key;
cout<<"请输入明文:"<<endl;
cin>>plain;
}
void PrintData(){
cout<<"打印arr"<<endl;
for(int i=0;i<26;i++)
cout<<arr[i]<<" ";
cout<<endl<<"打印M"<<endl;
auto it=M.begin();
while(it!=M.end()){
cout<<it->first<<" "<<it->second<<endl;
it++;
}
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
cout<<src[i][j]<<" ";
}
cout<<endl;
}
}
void Encode(){
string res=key;
for(int i=0;i<26;i++){
int x=M[key[i]];
int y=M[plain[i]];
res[i]=src[x][y];
}
cout<<"输出密文:"<<res<<endl;
}
int main(int argc, char** argv) {
init();
// PrintData();
Encode();
return 0;
}
3、Hill密码:
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
char arr[26];// 0~25 对应 a~z
map<char,int> Index;//first存放字母,second存放字母在数组index中对应的下标
int m;//明文长度
int K[1000][1000];
int P[1000];
int C[1000];
void init(){
for(int i=0;i<26;i++){
arr[i]='a'+i;
Index[arr[i]]=i;
}
}
void Encode(){
cout<<"=================Hill密码加密系统===================="<<endl;
string pt;
cout<<"请输入明文:";
cin>>pt;
m=pt.size();
cout<<"请输入"<<m<<"X"<<m<<"的加密矩阵(密钥):"<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++)
cin>>K[i][j];
}
for(int i=0;i<m;i++)
P[i]=Index[pt[i]];
for(int i=0;i<m;i++){
C[i]=0;
for(int j=0;j<m;j++){
C[i]+=K[i][j]*P[j];
}
C[i]%=26;
}
cout<<"输出密文:"<<endl;
for(int i=0;i<m;i++)
cout<<arr[C[i]];
cout<<endl;
}
void PrintData(){
cout<<"打印加密矩阵"<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++)
cout<<K[i][j]<<" ";
cout<<endl;
}
cout<<"打印明文对应的转置矩阵"<<endl;
for(int i=0;i<m;i++)
cout<<P[i]<<" ";
cout<<endl;
cout<<"打印密文转置矩阵"<<endl;
for(int i=0;i<m;i++)
cout<<C[i]<<" ";
cout<<endl;
cout<<"输出密文:"<<endl;
for(int i=0;i<m;i++)
cout<<arr[C[i]];
cout<<endl;
}
/*
样例输入:cost
1 3 5 7
10 4 6 8
2 3 6 9
11 12 8 5
样例输出:
hynn
*/
int main(int argc, char** argv) {
init();
Encode();
// PrintData();
return 0;
}
4、S盒:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int S[32][16];// 8个 4*16的矩阵
string plain;//明文
int getRandom(long long a,long long b){
return rand()%(b-a+1)+a;
}
void init(){
int arr[16];
for(int i=0;i<16;i++)// arr:源数据池
arr[i]=i;
//随机获取S盒子中4*8 行 数据(1~15的全排列)
int cnt=0;
do{
int pivot=getRandom(0,20202020);
if(pivot!=2020)
continue;
for(int i=0;i<16;i++)
S[cnt][i]=arr[i];
cnt++;
if(cnt==32)
break;
}while(next_permutation(arr,arr+16));
}
void PrintS(){
for(int i=0;i<32;i++){
if(i>0 && i%4==0)
cout<<endl;
for(int j=0;j<16;j++){
cout<<S[i][j]<<" ";
}
cout<<endl;
}
}
int CtoI(char c){
return c-'0';
}
string Dec2Bin(int Dec){
string bin="";
while(Dec){
int tmp=Dec%2;
char c='0'+tmp;
Dec/=2;
bin+=c;
}
reverse(bin.begin(),bin.end());
if(bin.size()<4){//校验4位输出
for(int i=0;i<=4-bin.size();i++)
bin="0"+bin;
}
return bin;
}
void Encode(){
cout<<"==================S盒密码加密系统=================="<<endl;
cout<<"请输入明文(6位二进制输入):"<<endl;
cin>>plain;
int x=CtoI(plain[0])*2 + CtoI(plain[5]);
int y=CtoI(plain[1])*8 + CtoI(plain[2])*4 + CtoI(plain[3])*2 + CtoI(plain[4]);
int res=S[x][y];//获得10进制密文输出
cout<<"对应密文为:"<<Dec2Bin(res)<<endl;
}
int main(int argc, char** argv) {
init();
// PrintS();
Encode();
return 0;
}