-1

我需要一个逻辑来实现我的目标。我的缓冲区数组大小为 38400。这个数组数据可以由控制器填充。在这里我必须获得一个AES算法。我必须从缓冲区读取 16 个字节的数据,然后加密,直到缓冲区结束。如何将数组溢出到 16 个字节并加密?. 我使用了以下逻辑,但我现在无法理解?

    unsigned char ptext[16] = "Attack at dawn!";
    unsigned char ctext[16];
    unsigned char decptext[16];
    unsigned char buffer[120*160*2];

    for (int count = 0; count < 120*160*2; count ++)
     buffer[count] = count + 1;

    for (i = 0; i < 120*160*2; i ++)
{

    ptext[i]= buffer[i];

    if(i%15 == 0)
    {
    aes_encrypt(ctx, ptext, ctext);
    for(k = 0; k<=i; k++)
            {
                ptext[k]='\0';
            }
    }
}


 void aes_encrypt(aes_ctx_t *ctx, unsigned char input[16], unsigned char output[16])
 {
    int i;

// copy input to state
for(i = 0; i < 16; i++)
    ctx->state[i & 0x03][i >> 2] = input[i];

aes_addroundkey(ctx, 0);

for(i = 1; i < ctx->rounds; i++) {
    aes_subbytes(ctx);
    aes_shiftrows(ctx);
    aes_mixcolumns(ctx);
    aes_addroundkey(ctx, i);
}

aes_subbytes(ctx);
aes_shiftrows(ctx);
aes_addroundkey(ctx, ctx->rounds);

// copy state to output
for(i = 0; i < 16; i++)
{
    output[i] = ctx->state[i & 0x03][i >> 2];
    printf("%c",output[i]);
}


 }

注意:我已经用随机数填充了 buffer[]。

我只需要知道如何拆分数组。

提前致谢。

4

1 回答 1

1

您不需要“拆分”数组(无论“拆分”对您意味着什么。)只需对它的每个 16 字节段进行操作:

void process_segment(unsigned char segment[])
{
    // Work on the first 16 bytes of 'segment'.
}

// ...

unsigned char buffer[120*160*2];

for (size_t i = 0; i < 120*160*2; i += 16) {
    process_segment(buffer + i);
}

以上只是一个例子。如果你想要一个嵌套for循环,你会做这样的事情:

unsigned char buffer[120*160*2];

for (size_t i = 0; i < 120*160*2; i += 16) {
    unsigned char* segment = buffer + i;
    // Work on the first 16 bytes of 'segment'.
    for (size_t j = 0; j < 16; ++j) {
        // Work on segment[j].
    }
}

您可能应该将您的 aes_encrypt() 函数更改为采用 anunsigned char input[]而不是 anunsigned char input[16]以便您可以传递segment给它。

您发布的代码将变成这样:

    unsigned char ptext[16] = "Attack at dawn!";
    unsigned char ctext[16];
    unsigned char decptext[16];
    unsigned char buffer[120*160*2];

    for (int count = 0; count < 120*160*2; count++)
        buffer[count] = count + 1;

    for (i = 0; i < 120*160*2; i += 16) {
        unsigned char *segment = buffer + i;
        aes_encrypt(ctx, segment, ctext);
        // Clear the current 16-byte segment.
        memset(segment, '\0', 16);
        // ctext now contains the encrypted data of the current
        // 16-byte segment. I assume you want to save it somewhere
        // now since it will be overridden in the next iteration of
        // the loop.
    }

您的 aes_encrypt() 函数的签名将变为:

void aes_encrypt(aes_ctx_t *ctx, unsigned char input[],
                 unsigned char output[16])
于 2013-02-12T13:03:25.350 回答