⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rotor.cpp

📁 本程序只能实现轮转机加密
💻 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 + -