zoukankan      html  css  js  c++  java
  • Vigenere密码加密、解密算法实现

    //DsVigenere.cpp    穷举搜索法破解Vigenere
    #include<iostream>
    #include<fstream>
    #include<string>
    #include<cstdlib> //#include<stdlib.h>
    #include<windows.h>
    using namespace std;
    
    ////data structure
    const int pmsize=1000;//the maximum length of the plaintext
    //int i=0,j=0; //global variable
    char p[pmsize]={'\0'},k[100]={'\0'},c[pmsize]={'\0'};//p,k,c memories plainrtext,ciphertext and cipher
    
    ////preparing before begining
    void prepare()
    {
    	cout<<endl;
    	cout<<"               "<<"穷举法破解Vigenere密码程序"<<endl;
    	cout<<"                      "<<"设计者:刘懿"<<endl;
    	cout<<"                      "<<"[2010.5.23]"<<endl;
    	cout<<"==========================================================="<<endl;
    	//judge whether entering the plaintext&cipher;
        char judge='Y';
    	cout<<"Please sure wether you have entered the plaintext&cipher" 
    		<<endl<<"with the txt form (enter Y/N):";
    		cin>>judge;
    	if(judge=='N'||judge=='n')
    	{
    		cout<<"Please enter the plaintext&cipher with the txt form Firstly!"<<endl;
    		exit(1);
    	}
    }
    
    ////init data
    void init()  
    {
    	//read the plaintext&cipher from txt file
    	ifstream ifs1,ifs2;
    	if(!ifs1||!ifs2)  //exit program if ifstream could not pen file
    	{
    		cerr<<"File could not be opened"<<endl;
    		exit(1);
    	}
    	ifs1.open("plaintext1.txt");ifs1.read(p,sizeof(p));ifs1.close();
    	ifs2.open("ciphertext1.txt");ifs2.read(c,sizeof(c));ifs2.close();
    	cout<<"The plaintext is:"<<endl<<p<<endl;
    	cout<<"The ciphertext is:"<<endl<<c<<endl;
    }
    
    ////Remove spaces in the arrays p&c
    void Rspace()
    {
    	int i=0,j=0;
    	for(i=0;p[i]!='\0';i++)
    	{
    		if(p[i]==' ')
    		{
    			for(j=i;p[j+1]!='\0';j++)
    				p[j]=p[j+1];
    			p[j]='\0';
    		}
    	}
    	for(i=0;c[i]!='\0';i++)
    	{
    		if(c[i]==' ')
    		{
    			for(j=i;c[j+1]!='\0';j++)
    				c[j]=c[j+1];
    			c[j]='\0 ';
    		}
    	}
    }
    
    //Crack the plaintext
    void Dcipher()
    {
    	int number=0;
    	for(int i=0;p[i]!='\0';i++) //dssolve the keys by brute force
    	{
    		for(int word='a';word<='z';word++)
    		{
    			if(c[i]==(word-'a'+(p[i]-'a'))%26+'a')
    			{
    				k[number]=word;
    				number++;
    			}
    		}
    	}
    	for(int flag=1;flag<number;flag++) //delete the repeated cipher
    		if(k[0]==k[flag])
    			k[flag]='\0';
    }
    
    ////output the results and delete the plaintext&cipher in the plaintext.txt&key.txt
    void out()
    {
    	cout<<"The key is:"<<endl<<k<<endl;
    	//ofstream del1("plaintext.txt",ios_base::trunc); //delete the plaintext
    	//ofstream del2("key.txt",ios_base::trunc); //delete the key
    }
    
    ///////////////////////////////////////////////////////////
    int main()
    {
    	int istart,istop;  
    	prepare();
    	istart=GetTickCount();
    	init();
    	Rspace();//Remove spaces in the arrays
    	Dcipher();
    	out();
    	istop=GetTickCount();
    	cout<<"Time spent on this program(Except for the course of preparing) is "<<istop-istart<<" ms"<<endl;  
    	system("pause");
    	return 0;
    }
    
    密码学实验时写的代码:
    //Vigenere.cpp    Vigenere密码加密
    #include<iostream>
    #include<fstream>
    #include<string>
    #include<cstdlib>
    #include<windows.h>
    using namespace std;
    
    ////data structure
    const int pmsize=1000;//the maximum length of the plaintext
    int i=0,j=0,t=0; //global variable
    char p[pmsize]={'\0'},k[100]={'\0'},c[pmsize]={'\0'};//p,k,c memories plainrtext,ciphertext and cipher
    
    ////preparing before begining
    void prepare()
    {
    	cout<<endl;
    	cout<<"               "<<"Vigenere加密密码程序"<<endl;
    	cout<<"                    "<<"设计者:刘懿"<<endl;
    	cout<<"                    "<<"[2010.5.23]"<<endl;
    	cout<<"========================================================="<<endl;
    	//judge whether entering the plaintext&cipher;
        char judge='Y';
    	cout<<"Please sure wether you have entered the plaintext&cipher" 
    		<<endl<<"with the plaintext.txt&key.txt (enter Y/N):";
    		cin>>judge;
    	if(judge=='N'||judge=='n')
    	{
    		cout<<"Please enter the plaintext&cipher with the txt form Firstly!"<<endl;
    		exit(1);
    	}
    }
    
    
    
    
    
    ////init data
    void init()  //read the plaintext&cipher from txt file
    {
    	ifstream ifs1,ifs2;
    	if(!ifs1||!ifs2)  //exit program if ifstream could not pen file
    	{
    		cerr<<"File could not be opened"<<endl;
    		exit(1);
    	}
    	ifs1.open("plaintext.txt");ifs1.read(p,sizeof(p));ifs1.close();
    	ifs2.open("key.txt");ifs2.read(k,sizeof(k));ifs2.close();
    	cout<<"The plaintext is:"<<endl<<p<<endl;
    }
    
    ////Remove spaces in the arrays p&k
    void Rspace()
    {
    	for(i=0;p[i]!='\0';i++)
    	{
    		if(p[i]==' ')
    		{
    			for(j=i;p[j+1]!='\0';j++)
    				p[j]=p[j+1];
    			p[j]='\0';
    		}
    	}
    	for(i=0;k[i]!='\0';i++)
    	{
    		if(k[i]==' ')
    		{
    			for(j=i;k[j+1]!='\0';j++)
    				k[j]=k[j+1];
    			k[j]='\0 ';
    		}
    	}
    }
    
    //Encrypt the plaintext
    void Encrypt()
    {
    		for(i=0;p[i]!='\0';i++) //Encrypt the plaintext
    		c[i]=(k[i%strlen(k)]-'a'+(p[i]-'a'))%26+'a';
    }
    
    ////output the results and delete the plaintext&cipher in the plaintext.txt&key.txt
    void out()
    {
    	cout<<"The ciphertext is:"<<endl<<c<<endl;
    	ofstream del1("plaintext.txt",ios_base::trunc); //delete the plaintext
    	ofstream del2("key.txt",ios_base::trunc); //delete the key
    }
    
    ///////////////////////////////////////////////////////////
    int main()
    {
    	int istart,istop;  
    	prepare();
    	istart=GetTickCount();
    	init();
    	Rspace();//Remove spaces in the arrays
    	Encrypt();
    	out();	
    	istop=GetTickCount();
    	cout<<"Time spent on this program(Except for the course of preparing) is "<<istop-istart<<" ms"<<endl;  
    	system("pause");
    	return 0;
    }
    
    
    
  • 相关阅读:
    Linux ps 查看进程
    Linux free命令
    Linux sar命令
    php 上传文件
    sql 计算周围公里语句
    mysql sum 和 count 函数 合并使用
    php函数 ceil floor round和 intval
    linux sort 命令
    Sicily 2711. 模板与STL 解题报告
    堆排序
  • 原文地址:https://www.cnblogs.com/lyfruit/p/1966301.html
Copyright © 2011-2022 走看看