Прежде всего мы должны установить требования. см. Эту ссылку
После успешной установки требований мы запускаем простой привет мир MPI.
Hello World!
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
// Finalize the MPI environment.
MPI_Finalize();
}
исходный код выше
Компиляция и запуск
$ mpicc mhello.c -o mhello
$ mpirun -np #numberOfProcess ./mhello
После успешного запуска этого кода вы можете пойти дальше.
И вернитесь к первоначальному Вопросу.
Я думаю, что вы используете часть проекта AES неправильно.
Byвыполнение некоторых изменений и использование
AES_ECB_decrypt(&ctx, data_file);
AES_ECB_encrypt(&ctx, data_file);
работ.
Страница проекта GitHub, в которой рассказывается, как использовать функции Enc и Dec см.
Второе важное изменениеstruct AES_ctx ctx;
Это рабочая версия кода.
mpi-hello.c *. 1051 *
#include <stdio.h>
#include <string.h>
#include <mpi.h>
#include "aes.h"
/*
* compile
* mpicc mpi-hello.c aes.c -o mpi-hello
*
* Run
* mpirun -np 2 executable
*
*
*
* */
struct AES_ctx ctx;
unsigned long ToUInt(char* str)
{
unsigned long mult = 1;
unsigned long re = 0;
int len = strlen(str);
for(int i = len -1 ; i >= 0 ; i--)
{
re = re + ((int)str[i] -48)*mult;
mult = mult*10;
}
return re;
}
int main(int argc, char** argv) {
int size,rank=0;
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int data = 532123;
uint8_t data_file[10];
printf("this is in main\n");
if (rank == 0) {
printf("data rank: 0: %d\n", data);
//convert in to string
sprintf( data_file, "%d", data);
//string
printf("data rank: 0: %s\n", data_file);
//encrypt data
AES_ECB_encrypt(&ctx, data_file);
printf("Sending in 0 after crypt: %s\n", data_file);
printf("strlen send: %d\n", strlen(data_file));
MPI_Send(data_file,16,MPI_UINT8_T,1,0,MPI_COMM_WORLD);
}else{
MPI_Recv(data_file,16,MPI_UINT8_T,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("Recieved in 1 before: %s\n",data_file);
printf("strlen recv: %d\n", strlen(data_file));
AES_ECB_decrypt(&ctx, data_file);
printf("DEC at Rank 1 string: %s\n", data_file);
printf("DEC at Rank 1 int: %u\n", ToUInt(data_file));
}
MPI_Finalize();
}
Важные примечания
PS .
Установка из репозитория в системе на основе Debian не работает, и я должен собрать ее из исходного кода.
Исходный источник Преобразование строки в int Я знаю, что это может быть не лучшим решением, но работает.
Как запустить MPI .
- Краткое руководство по MPI C
Изменить 1
#include <stdio.h>
#include <string.h>
#include <mpi.h>
#include "aes.h"
/*
* compile
* mpicc mpi-hello.c aes.c -o mpi-hello
*
* Run
* mpirun -np 2 executable
*
*
*
* */
struct AES_ctx ctx;
unsigned long ToUInt(char* str)
{
unsigned long mult = 1;
unsigned long re = 0;
int len = strlen(str);
for(int i = len -1 ; i >= 0 ; i--)
{
re = re + ((int)str[i] -48)*mult;
mult = mult*10;
}
return re;
}
int main(int argc, char** argv) {
int size,rank=0;
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int data = 532123;
uint8_t data_file[10];
printf("this is in main\n");
if (rank == 0) {
printf("data rank: 0: %d\n", data);
//convert in to string
sprintf( data_file, "%d", data);
//string
printf("data rank: 0: %s\n", data_file);
//encrypt data
//AES_ECB_encrypt(&ctx, data_file);
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("Sending in 0 after crypt: %s\n", data_file);
printf("strlen send: %d\n", strlen(data_file));
MPI_Send(data_file,10,MPI_UINT8_T,1,0,MPI_COMM_WORLD);
}else{
MPI_Recv(data_file,10,MPI_UINT8_T,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("Recieved in 1 before: %s\n",data_file);
printf("strlen recv: %d\n", strlen(data_file));
//AES_ECB_decrypt(&ctx, data_file);
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("DEC at Rank 1 string: %s\n", data_file);
printf("DEC at Rank 1 int: %u\n", ToUInt(data_file));
}
MPI_Finalize();
}
Редактировать 2
Применить запрос в комментарии.
#include <stdio.h>
#include <string.h>
#include <mpi.h>
#include "aes.h"
/*
* compile
* mpicc mpi-hello.c aes.c -o mpi-hello
*
* Run
* mpirun -np 2 executable
*
*
* */
unsigned long ToUInt(char* str)
{
unsigned long mult = 1;
unsigned long re = 0;
int len = strlen(str);
for(int i = len -1 ; i >= 0 ; i--)
{
re = re + ((int)str[i] -48)*mult;
mult = mult*10;
}
return re;
}
int main(int argc, char** argv) {
int size,rank=0;
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int data = 532123;
uint8_t data_file[10];
//start Crypto Section
//~ key and iv
///
uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
};
uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
};
///
struct AES_ctx ctx;
printf("this is in main\n");
if (rank == 0) {
printf("data rank: 0: %d\n", data);
//convert in to string
sprintf( data_file, "%d", data);
//string
printf("data rank: 0: %s\n", data_file);
///Enc
//set
AES_init_ctx_iv(&ctx, key, iv);
//enc
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("Sending in 0 after crypt: %s\n", data_file);
printf("strlen send: %d\n", strlen(data_file));
MPI_Send(data_file,10,MPI_UINT8_T,1,0,MPI_COMM_WORLD);
}else{
MPI_Recv(data_file,10,MPI_UINT8_T,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("Recieved in 1 before: %s\n",data_file);
printf("strlen recv: %d\n", strlen(data_file));
///Dec
//set
AES_init_ctx_iv(&ctx, key, iv);
//dec
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("DEC at Rank 1 string: %s\n", data_file);
printf("DEC at Rank 1 int: %u\n", ToUInt(data_file));
}
MPI_Finalize();
}
Редактировать 3
Поместить ключ и iv в секцию if else.
if (rank == 0) {
printf("data rank: 0: %d\n", data);
//convert in to string
sprintf( data_file, "%d", data);
//string
printf("data rank: 0: %s\n", data_file);
//~ key and iv
///
uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
};
uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
};
///
///Enc
//set
AES_init_ctx_iv(&ctx, key, iv);
//enc
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("Sending in 0 after crypt: %s\n", data_file);
printf("strlen send: %d\n", strlen(data_file));
MPI_Send(data_file,10,MPI_UINT8_T,1,0,MPI_COMM_WORLD);
}else{
MPI_Recv(data_file,10,MPI_UINT8_T,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("Recieved in 1 before: %s\n",data_file);
printf("strlen recv: %d\n", strlen(data_file));
//~ key and iv
///
uint8_t key[32] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
};
uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
};
///
///Dec
//set
AES_init_ctx_iv(&ctx, key, iv);
//dec
AES_CTR_xcrypt_buffer(&ctx, data_file, strlen(data_file));
printf("DEC at Rank 1 string: %s\n", data_file);
printf("DEC at Rank 1 int: %u\n", ToUInt(data_file));
}
Например, Вы можете изменить первый элемент ключа, например: 0x60 -> 0x61
в любом случае, если не в обоих, а затем перекомпилировать и запустить программу, чтобы увидеть, если получатель не имеет правильного ключа, который он / она не можетрасшифруйте ваши зашифрованные данные.
[ToDo]
- Добавьте еще несколько пояснений к AES.