-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() 関数を変更して、 an のunsigned 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 に答える