Как исправить дешифрование AES в C с помощью MPI - PullRequest
0 голосов
/ 02 октября 2019

В настоящее время я пытаюсь использовать MPI для передачи определенных зашифрованных данных с одного процессора на другой, используя только 2 процессора, чтобы просто проверить, работает ли шифрование или дешифрование. У меня есть значение int, которое преобразуется в строку для шифрования, а затем отправляется в процессорный разряд 1. Я правильно получаю строку в процессоре, но когда я вызываю функцию дешифрования, она, похоже, не дает мне открытый текст. Я скачал код AES с https://github.com/kokke/tiny-AES-C

int size,rank;
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);


int data = 532123;
uint8_t data_file[10];
uint8_t key[1] = {50};
int data_decrypt;
uint8_t iv[1] = {1};


struct AES_ctx ctx;

if (rank == 0) {

    sprintf((char *) data_file, "%d", data);
    AES_init_ctx_iv(&ctx, key, iv);
    AES_CTR_xcrypt_buffer(&ctx, data_file, strlen((char *) data_file));

    printf("Sending in 0: %s\n",(char*) 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: %s\n",(char*)data_file);

    AES_init_ctx_iv(&ctx, key, iv);
    AES_CTR_xcrypt_buffer(&ctx, data_file, strlen((char*)data_file));
    printf("DEC at Rank 1: %s\n",(char*) data_file);

}
MPI_Finalize();
return 0;

1 Ответ

0 голосов
/ 02 октября 2019

Прежде всего мы должны установить требования. см. Эту ссылку

После успешной установки требований мы запускаем простой привет мир 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();
}

Важные примечания

  • Поместите aes.c исходный файл в ту же папку исходного источника, т.е.: mpi-hello.c
  • скомпилируйте код с помощью mpicc mpi-hello.c aes.c -o mpi-hello

  • работает с: mpirun -np 2 ./mpi-hello

  • Я считаю, что второй аргумент MPI_Send должен быть изменен на 16, но почему?

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.
...