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

📄 mpi_aes.cpp

📁 运用分布式并行计算进行AES加解密的代码~~具有一定的参考价值~~内容可以灵活修改
💻 CPP
字号:

#define HAVE_NO_VARIABLE_RETURN_TYPE_SUPPORT 1

#include <mpi.h>

#include <afx.h>
#include <iostream>
#include "aes.h"
#include "cpu.h"

using namespace std;
using std::cout;
using std::endl;

// #define HAVE_NO_VARIABLE_RETURN_TYPE_SUPPORT 1


int main(int argc, char *argv[])
{
	int myid/*,numprocs*/;           /* 整型变量 myid 和 numprocs 分别用来记录某一个
									并行执行进程的标识和所有参加计算的进程的个数*/

/*	int namelen; */              /* namelen 是实际得到的机器名字的长度*/

/*	char processor_name[MPI_MAX_PROCESSOR_NAME];*/	/*MPI_MAX_PROCESSOR_NAME宏:某一MPI的具体实现中允许机器名字
													的最大长度,机器名放在变量processor_name中; */

	int N0,N1;
	int cpusp[1],lenth[1];
	int len0,len1;
	
	unsigned char inBuff[160] = "1234567890qwertyuiopasdfghjkl;zxcvbnm,./1234567890qwertyuiopasdfghjkl;zxcvbnm,./1234567890qwertyuiopasdfghjkl;zxcvbnm,./1234567890qwertyuiopasdfghjkl;zxcvbnm,.";
	unsigned char *inBuff1 = new unsigned char[];
	unsigned char *inBuff2 = new unsigned char[];
	unsigned char *inTemp1 = new unsigned char[];
	unsigned char *inTemp2 = new unsigned char[];
	unsigned char *ouBuff1 = new unsigned char[];
	unsigned char *ouBuff2 = new unsigned char[];
	unsigned char *ouTemp1 = new unsigned char[];
	unsigned char *ouTemp2 = new unsigned char[];
	unsigned char ouBuff[160];
	CTimer cpu;
	Aes aes(16,(unsigned char*)"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17");
	
	MPI_Status status;

	MPI_Init(&argc, &argv);        /* MPI程序的初始化*/

	/*得到当前正在运行的进程的标识号,放在myid中*/
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);

	/*得到所有参加运算的进程的个数,放在numprocs中;*/
	/*MPI_Comm_size(MPI_COMM_WORLD,&numprocs);*/

	/* MPI_Get_processor_name得到本进程运行的机器的名称,
	结果放在processor_name中,长度放在namelen中;*/
	/*MPI_Get_processor_name(processor_name,&namelen);*/

	if (myid == 0)
	{
		N0 = cpu.Cpu();
		MPI_Recv(cpusp,1,MPI_INT,1,99,MPI_COMM_WORLD,&status);
		N1 = cpusp[0];
	 	len0 = 160 * N1 / ( N0 + N1 );
		len1 = 160 - len0;
		lenth[0] = len1;
		MPI_Send(lenth,1,MPI_INT,1,99,MPI_COMM_WORLD);
		unsigned char *inBuff1 = new unsigned char[len0];
		unsigned char *inBuff2 = new unsigned char[len1];
		unsigned char *inTemp1 = new unsigned char[25];
		unsigned char *inTemp2 = new unsigned char[25];
		unsigned char *ouBuff1 = new unsigned char[len0];
		unsigned char *ouBuff2 = new unsigned char[len1];
		unsigned char *ouTemp1 = new unsigned char[25];
		unsigned char *ouTemp2 = new unsigned char[25];		
		cout << "进程0需要加密的字符串:";
		for (int i = 0 ; i < len0 ; i ++)
		{
			inBuff1[i] = inBuff[i];
			cout << inBuff1[i];
		}
		cout << endl;
		cout << "进程1需要加密的字符串:";
		for ( i = 0 ; i < len1 ; i ++)
		{
			inBuff2[i] = inBuff[i + len0];
			cout << inBuff2[i];
		}
		cout << endl;

		MPI_Send(inBuff2,len1,MPI_UNSIGNED_CHAR,1,99,MPI_COMM_WORLD);
		
		cout << "ouTemp1 = ";
		for ( i = 0 ; i < len0 / 16 + 1; i ++)
		{
			CString str = "",strTmp;

			for (int j = 0 ; j < 16 ; j ++)
			{
				inTemp1[j] = inBuff1[j + i * 16];
				aes.Cipher(inTemp1,ouTemp1);

				ouBuff1[j + i * 16] = ouTemp1[j];
				strTmp.Format("%02x",ouTemp1[j]);
			}
			cout << str;
		}
		cout << endl;

		MPI_Recv(ouBuff2,len1,MPI_UNSIGNED_CHAR,1,99,MPI_COMM_WORLD,&status);
		for ( i = 0 ; i < len0 ; i ++)
		{
			ouBuff[i] = ouBuff1[i];
		}
		for ( i = 0 ; i < len1 ; i ++)
		{
			ouBuff[i + len0] = ouBuff2[i];
		}

		cout << "进程0加密后的字符串:";
		for ( i = 0 ; i < len0 ; i ++)
		{
			cout << ouBuff1[i];
		}
		cout << endl;
		cout << "进程1加密后的字符串:";
		for ( i = 0 ; i < len1 ; i ++)
		{
			cout << ouBuff2[i];
		}
		cout << endl;
		cout << "ouBuff = ";
		for ( i = 0 ; i < 160 ; i ++)
		{
			cout << ouBuff[i];
		}
		cout << endl;

//////////////////////////////////////////////////////////////////////////////////////////////////
//进程0解密
		cout << "ouTemp1 = ";
		for ( i = 0 ; i < len0 / 16 + 1; i ++)
		{
			for (int j = 0 ; j < 16 ; j ++)
			{
				inTemp1[j] = ouBuff1[j + i * 16];
				aes.InvCipher(inTemp1,ouTemp1);
				cout << ouTemp1[j];
				inBuff1[j + i * 16] = ouTemp1[j];
			}
		}
		cout << endl;

		MPI_Recv(inBuff2,len1,MPI_UNSIGNED_CHAR,1,99,MPI_COMM_WORLD,&status);
		
		for ( i = 0 ; i < len0 ; i ++)
		{
			inBuff[i] = inBuff1[i];
		}

		for ( i = 0 ; i < len1 ; i ++)
		{
			inBuff[i + len0] = inBuff2[i];
		}
		
		cout << "inBuff1 = ";
		for ( i = 0 ; i < len0 ; i ++)
		{
			cout << inBuff1[i];
		}
		cout << endl;
		cout << "inBuff2 = ";
		for ( i = 0 ; i < len1 ; i ++)
		{
			cout << inBuff2[i];
		}
		cout << endl;
		cout << "inBuff = ";
		for ( i = 0 ; i < 160 ; i ++)
		{
			cout << inBuff[i];
		}
		cout << endl;
	}
	else if (myid == 1)
	{
		cpusp[0] = cpu.Cpu();

		MPI_Send(cpusp,1,MPI_INT,0,99,MPI_COMM_WORLD);

		MPI_Recv(lenth,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
		len1 = lenth[0];
		
		unsigned char *inBuff3 = new unsigned char[len1];
		unsigned char *inTemp3 = new unsigned char[25];
		unsigned char *ouBuff3 = new unsigned char[len1];
		unsigned char *ouTemp3 = new unsigned char[25];	

		MPI_Recv(inBuff3,len1,MPI_UNSIGNED_CHAR,0,99,MPI_COMM_WORLD,&status);
		for (int i = 0 ; i < len1 / 16 + 1; i ++)
		{
			for (int j = 0 ; j < 16 ; j ++)
			{
				inTemp3[j] = inBuff3[j + i * 16];
				aes.Cipher(inTemp3,ouTemp3);
				ouBuff3[j + i * 16] = ouTemp3[j];
			}
		}

		MPI_Send(ouBuff3,len1,MPI_UNSIGNED_CHAR,0,99,MPI_COMM_WORLD);
		
//////////////////////////////////////////////////////////////////////////////////////////////////
//进程1解密
		for ( i = 0 ; i < len1 / 16 + 1; i ++)
		{
			for (int j = 0 ; j < 16 ; j ++)
			{
				inTemp3[j] = ouBuff3[j + i * 16];
				aes.InvCipher(inTemp3,ouTemp3);
				inBuff3[j + i * 16] = ouTemp3[j];
			}
		}

		MPI_Send(inBuff3,len1,MPI_UNSIGNED_CHAR,0,99,MPI_COMM_WORLD);
	}
	

	MPI_Finalize();      /*MPI程序的结束*/

	return 0;  

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -