6

私は libgcrypt (Gentoo x64 の v1.6.1) で遊んでいて、既に aes256-cbc と aes256-ctr を実装 (および AE テスト ベクトルでテスト) しました。今、私は aes256-gcm を見ていますが、ワークフローについて疑問があります。以下に、単純な暗号化プログラムのスケルトンを示します。

int main(void){

    unsigned char TEST_KEY[] = {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};
    unsigned char TEST_IV[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
    unsigned char TEST_PLAINTEXT_1[] = {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a};

    unsigned char cipher[16] = {0};

    int algo = -1, i;
    const char *name = "aes256";

    algo = gcry_cipher_map_name(name);

    gcry_cipher_hd_t hd;
    gcry_cipher_open(&hd, algo, GCRY_CIPHER_MODE_GCM, 0);
    gcry_cipher_setkey(hd, TEST_KEY, 32);
    gcry_cipher_setiv(hd, TEST_IV, 16);

    gcry_cipher_encrypt(hd, cipher, 16, TEST_PLAINTEXT_1, 16);
    char out[33];
    for(i=0;i<16;i++){
        sprintf(out+(i*2), "%02x", cipher[i]);
    }
    out[32] = '\0';
    printf("%s\n", out);

    gcry_cipher_close(hd);

    return 0;
}

GCM モードでは、次の命令も必要です。

gcry_cipher_authenticate (gcry cipher hd t h , const void * abuf , size t abuflen )
gcry_error_t gcry_cipher_gettag (gcry cipher hd t h , void * tag , size t taglen )

したがって、暗号化プログラムの正しいワークフローは次のとおりです。

gcry_cipher_authenticate
gcry_cipher_encrypt
gcry_cipher_gettag

しかし、私が理解していないのは次のとおりです。

  1. abuf塩っぽい?(だから私はそれを使用して生成する必要がありgcry_create_nonceますか?)
  2. ファイルを暗号化したい場合、void *tag何を出力ファイルに書き込む必要がありますか?
4

1 に答える 1

5

1) gcry_cipher_authenticate は、関連データで認証された暗号化をサポートするためのものです。abuf は、認証する必要があるが暗号化する必要がないデータです。たとえば、パケットを送信する場合、本文を暗号化したい場合がありますが、パケットを配信するには、ヘッダーを暗号化せずに送信する必要があります。暗号によって生成されたタグは、暗号化されたデータとプレーンで送信されたデータの両方に整合性を提供します。

2) タグは復号化後に使用され、データが改ざんされていないことを確認します。暗号化されたテキストにタグを追加します。暗号化されたデータと関連する (暗号化されていない) データで計算されるため、復号化するときに両方が必要になることに注意してください。

GCM の詳細については、次のドキュメントを確認してください。

http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800 -38D.pdf

また、 http://crypto.stackexchange.comで、このような暗号化に関する質問に対するより迅速な回答を得ることができます。

于 2014-02-21T07:08:36.323 に答える