2013-09-06 3 views
1

Я хочу использовать реализацию AES-128 с сохранением памяти. Я нашел реализацию Karl Malbrain.Неправильное использование библиотеки AES?

Я использую его на код ниже:

void encryptUboot(void){ 
    //uint8_t key[AES_KEY_LENGTH] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; 
    uint8_t key[AES_KEY_LENGTH] = {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x21, 0x21}; 
    uint8_t keyschedule[AES_KEY_LENGTH * AES_ROUNDS] = {0x00}; 
    uint8_t message[5] = "test"; 
    uint8_t cipher[16] = {0x00}; 
    uint8_t i; 

    if(debug) printf("\n[D] Running AES-128 encryption\n"); 

    aes_expand_key(key, keyschedule); 
    aes_encrypt(message, keyschedule, cipher); 
    printf("message: %s | cipher: ", message); 
    for(i = 0; i<AES_KEY_LENGTH; i++){ 
     printf("%02x ", cipher[i]); 
    } 

} 

Этот выход:

[D] Running AES-128 encryption
message: test | cipher: 2d 58 45 71 24 43 f5 cd 69 6d 07 b3 a3 29 de 8f

Однако, используя код из here (почтовый файл) с кодом ниже ...

// AES usage example 
// compile as: gcc main.c aes.h aes.c 

#include <stdlib.h> 
#include "aes.h" 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 

    unsigned char key[KEY_128] = {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x21, 0x21}; 
    unsigned char ptext[16] = "test"; 
    unsigned char ctext[16]; 
    unsigned char decptext[16]; 
    unsigned int i = 0; 
    aes_ctx_t *ctx; 

    init_aes(); 
    ctx = aes_alloc_ctx(key, sizeof(key)); 
    if(!ctx) { 
      perror("aes_alloc_ctx"); 
      return EXIT_FAILURE; 
    } 
    aes_encrypt(ctx, ptext, ctext); 
    for(i=0;i<KEY_128;i++) printf("%02x ", ctext[i]); 
    puts(""); 
    aes_decrypt(ctx, ctext, decptext); 
    puts(decptext); 

    aes_free_ctx(ctx); 
    return EXIT_SUCCESS; 
} 

.. он выдает разницу аренда шифра:

1f 53 3f 60 15 d5 ab 16 69 b6 c6 3b 9e 77 2f 0c
test

ли вы мою ошибку? Очевидно, что я неправильно использую эти библиотеки.

Спасибо, -P

+0

вы должны посмотреть ключевое расписание: как оно построено для второго примера? – lucasg

ответ

1

Хотя я не мог найти точную функцию, которую вы используете в Malbrains коде, я считаю, ваша проблема заключается в разнице в длине массива для message. Алгоритм шифрует блоки из 128 бит (16 байтов), но вы выделили только 5 байтов.

uint8_t message[5] = "test"; 

против

unsigned char ptext[16] = "test"; 

Попробуйте инициализацией его с точно такими же данными.

uint8_t message[16]; 
memset(message, 0, sizeof(message)); 
memcpy(message, "test", 5); 
+0

Большое спасибо. Именно по этой причине. Теперь все работает отлично! –

Смежные вопросы