解密程序就是利用加密密钥把加密的文档即秘文用密钥恢复成原来的文档。算法实现的原理就是用密钥把秘文文档重新编号,然后按密钥的排序结果输出秘文,就可以得到原加密的文档,也就达到了解密的目的。
#include
"mpi.h"
#include
<stdio.h>
#include
<stdlib.h>
#include
<time.h>
#include
<string.h>
#include
<iostream>
void
main (int argc, char * argv[])
{
char str[15];//
用于保存加密的字符串
int myid, numprocs; //
进程号、进程数
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
MPI_Init ( &argc, &argv );
MPI_Comm_rank ( MPI_COMM_WORLD, &myid );
MPI_Comm_size ( MPI_COMM_WORLD, &numprocs );
MPI_Get_processor_name(processor_name,&namelen);
if(myid==0) //
读取密钥信息,并把密钥传给1号进程。
{
FILE *key=fopen("key.txt","r");
if(key){
int temp;
temp=fgetc(key)-48;
fprintf(stderr,"
密钥:");
/*
读到文件结束,结束符为-1,ASCII码是-1-48=-49,所以把-49作为文件结束标志*/
while
(temp!=-49)
{
fprintf(stderr,"%d",temp);
MPI_Send(&temp,1,MPI_INT,1,0,MPI_COMM_WORLD);
temp=fgetc(key)-48;
}
fprintf(stderr,"/n");
MPI_Send(&temp,1,MPI_INT,1,0,MPI_COMM_WORLD);
}
}else if(myid==1)//1
号进程负责用接收到密钥解密加密的文档。
{
int recvnum=0;
FILE *out=fopen("out.txt","r");//
打开要解密的文档
fgets(str,15,out);
fprintf(stderr,"
密文:");
fprintf(stderr,str);
fprintf(stderr,"/n");
FILE *source=fopen("source.txt","w");//
用于保存解密后的文档
MPI_Recv(&recvnum,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
fprintf(stderr,"
解密后的原文是:");
while(recvnum!=-49)//
读到文件尾,结束
{
fprintf(stderr,"%c",str[recvnum]);
fprintf(source,"%c",str[recvnum]);
MPI_Recv(&recvnum,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
}
fprintf(stderr,"/n");
}
fprintf( stderr, "Process %d of %d on %s/n",myid, numprocs, processor_name );
MPI_Finalize ( );
}
说明:利用加密后的密文:
out.txt
和解密密钥
key.txt
解密,密文为:
udenctu.jb
,密钥为
9805721643
。如上图所示,解密后的文档保存到
source.txt
中。