1

メモリを節約する AES-128 実装を使用したいと考えています。Karl Malbrainの実装を見つけました。

以下のコードで使用しています。

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

ただし、ここのコード(zip ファイル) を以下のコードで使用すると ...

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

4

1 に答える 1

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);
于 2013-09-06T10:21:44.730 に答える