?? rotor.cpp
字號:
#include <iostream>
#include <fstream>
using namespace std;
class one_rator{
public:
int head;
int rail;
int * L ;
int * P ;
int count;
one_rator()
{
count = 0;
head = 0 ;
rail = 25;
L = new int[26];
P = new int[26];
}
void GetOneRator(void)
{
bool temp[26];
int index;
for(int i = 0;i<26;i++)
{
P[i]=i;
temp[i] = true;
}
for(i =0 ; i<26; i++)
{
while(true)
{
index = rand()%26;
if(temp[index])
{
L[i] = index;
temp[index] = false;
break;
}
}
}
}
void ShiftDown() //輪子向下轉動一個。
{
int tempL = L[25];
int tempP = P[25];
for(int i = 25 ; i>0;i--)
{
L[i] = L[i-1];
P[i] = P[i-1];
}
L[0] = tempL;
P[0] = tempP;
}
~one_rator()
{
delete L;
}
};
class Rator{
public:
int r;
one_rator * mRator ;
Rator()
{
r = 0;
}
void GetRator()
{
cout<<"Input r:";
cin>>r;
mRator = new one_rator [r];
for (int i = 0; i < r ; i ++)
{
mRator[i].GetOneRator();
}
}
};
Rator * StoreKey(Rator & key)
{
Rator * crkRator = new Rator;
crkRator->r = key.r;
crkRator->mRator = new one_rator [key.r];
for(int i = 0 ;i < key.r;i++)
{
crkRator->mRator[i].L = new int [26];
for(int m = 0 ;m<26;m++)
{
crkRator->mRator[i].L[m] = key.mRator[i].L[m];
crkRator->mRator[i].P[m] = key.mRator[i].P[m];
}
}
return crkRator;
}
void Encrypt(Rator myRator)
{
double splaintext[26],sp_all=0;//用來統計明文中各字符出現的頻率和明文總數
ifstream f1("ming.txt");
ofstream f2("mi.txt");
if(!f1)
{
cout<<"open file ming.txt failed! ";
return ;
}
if(!f2)
{
cout<<"open file mi.txt failed! ";
return ;
}
char temp;
int index,inter;
for(int i =0;i<26;i++)
splaintext[i] = 0;
while(f1.get(temp))
{
if( temp-'a'>=0 && temp -'a'<26)
temp = temp -'a';
else if(temp -'A'<26 && temp-'A'>=0)
temp = temp -'A';
else
continue;
index = temp;
splaintext[index] ++;
sp_all++;
for(i = 0;i<myRator.r;i++ )
for(inter =0 ; inter < 26; inter++)
if(myRator.mRator[i].P[index] == myRator.mRator[i].L[inter])
{
index = inter;
break;
}
myRator.mRator[i-1].ShiftDown();
myRator.mRator[i-1].count++;
for(i = myRator.r-1 ;i>=1;i--)
{
if( myRator.mRator[i].count == 26)
{
myRator.mRator[i].count=0;
myRator.mRator[i-1].ShiftDown();
myRator.mRator[i-1].count++;
}
}
if(myRator.mRator[0].count==26)
myRator.mRator[0].count=0;
temp ='a'+ index;
f2<<temp;
}
f1.close();
f2.close();
double sp_pro=0.00,c=0.00;
cout<<"明文個字母頻率分布圖:\n";
for(i = 0;i<26;i++)
{
c = splaintext[i] / sp_all;
sp_pro += c * c;
temp = 'a'+ i;
cout<<temp;
for(int j=0;j<c*150;j++)
cout<<"*";
cout<<"\n";
}
cout<<"明文重合指數:"<<sp_pro<<endl;
}
void Decrypt(Rator * crkRator)
{
double scipher[26],sc_all=0; //用來統計密文中各字符出現的頻率和密文總數
ifstream f3("mi.txt");
ofstream f4("jiemi.txt");
if(!f3)
{
cout<<"open file ming.txt failed! ";
return ;
}
if(!f4)
{
cout<<"open file mi.txt failed! ";
return;
}
char temp;
int index = 0,inter;
for(int i =0;i<26;i++)
scipher[i] = 0;
for(i =0; i<crkRator->r;i++)
crkRator->mRator[i].count=0;
while(f3.get(temp))
{
if( temp-'a'>=0 && temp -'a'<26)
temp = temp -'a';
else if(temp -'A'<26 && temp-'A'>=0)
temp = temp -'A';
else
continue;
index = temp;
scipher[index]++;
sc_all++;
for(i = crkRator->r-1 ;i >= 0 ;i--)
for(inter = 0; inter<26 ;inter++)
if(crkRator->mRator[i].P[inter] == crkRator->mRator[i].L[index])
{
index = inter;
break;
}
crkRator->mRator[crkRator->r-1].ShiftDown();
crkRator->mRator[crkRator->r-1].count++;
for(i = crkRator->r-1 ;i>=1;i--)
{
if( crkRator->mRator[i].count == 26)
{
crkRator->mRator[i].count=0;
crkRator->mRator[i-1].ShiftDown();
crkRator->mRator[i-1].count++;
}
}
if(crkRator->mRator[0].count==26)
crkRator->mRator[0].count=0;
temp = index +'a';
f4<<temp;
}
f3.close();
f4.close();
//統計明文,密文的重合指數;
double sc_pro=0.00,c=0.00;
for(i = 0;i<26;i++)
{
c = scipher[i] / sc_all;
sc_pro += c * c;
temp = 'a'+ i;
cout<<temp;
for(int j=0;j<c*150;j++)
cout<<"*";
cout<<"\n";
}
cout<<"密文重合指數:"<<sc_pro<<endl;
}
main()
{
Rator myRator;
Rator * crkRator;
myRator.GetRator(); //產生初始密玥
crkRator = StoreKey( myRator);//保存密玥
Encrypt(myRator);
Decrypt(crkRator);
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -