0

次のテスト コードでは、理論的には 58e2fccefa7e3061367f1d57a4e7455a の NIST テスト スイートの結果が得られるはずですが、出力の 16 進ダンプでは代わりに 9eeaed13b5f591104e2cda197fb99eeaed13b5f591104e2cda197fb9 が生成されます。

#include <iostream>
#include <cstdio>
#include <polarssl/md.h>
#include <polarssl/entropy.h>
#include <polarssl/ctr_drbg.h>
#include <polarssl/cipher.h>
#include <cstdlib>
#include <fstream>


int main(int argc, char** argv) {
const cipher_info_t *cipher_info;
        cipher_info = cipher_info_from_string( "AES-128-GCM" );
        cipher_context_t cipher_ctx;
    cipher_init_ctx (&cipher_ctx,cipher_info);
        std::cout<<"KEYLEN"<<std::endl;
        std::cout<<cipher_info->key_length<<std::endl;
    std::cout<<"IVLEN"<<std::endl;
    std::cout<<cipher_info->iv_size<<std::endl;
unsigned char key[cipher_info->key_length/8];
    unsigned char iv[cipher_info->iv_size];
    memset(key,0x00,cipher_info->key_length/8);
    memset(iv,0x00,cipher_info->iv_size);
    unsigned char iBuffer[10];
    unsigned char oBuffer[1024];
    size_t ilen, olen;


std::ofstream oFile2;
    oFile2.open("testOut",std::ofstream::out | std::ofstream::trunc | std::ofstream::binary);

        cipher_setkey( &cipher_ctx,key,cipher_info->key_length,POLARSSL_ENCRYPT);
        cipher_set_iv( &cipher_ctx, iv, 16 );
        cipher_reset( &cipher_ctx );
    cipher_update( &cipher_ctx, iBuffer, sizeof(iBuffer), oBuffer, &olen );
    oFile2 << oBuffer;
    cipher_finish( &cipher_ctx, oBuffer, &olen );
    oFile2 << oBuffer;
    oFile2.close();
}

これはnISTテストです:

Variable 
Value 
K  00000000000000000000000000000000
P
IV 000000000000000000000000
H 66e94bd4ef8a2c3b884cfa59ca342b2e
Yo 00000000000000000000000000000001
E ( K,Yo) 58e2fccefa7e3061367f1d57a4e7455a
len(A)||len(C)  00000000000000000000000000000000
GHASH (H,A,C) 00000000000000000000000000000000    
C
T 58e2fccefa7e3061367f1d57a4e7455a

(テストケース No. 1 http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf )

4

1 に答える 1

2

すぐに 2 つの間違いが見られます。

  1. プレーン テキストのサイズは、まったくバイトがないのではなく、10 バイトに設定されています。これにより、暗号文が大きくなりすぎて、認証タグが正しくなくなります。
  2. IV は、0 に設定された 16 バイトではなく、0 に設定された 12 バイトです。GCM モードのデフォルトは 12 です。

これらの問題は次の行にあります。

unsigned char iBuffer[10];
...
cipher_update( &cipher_ctx, iBuffer, sizeof(iBuffer), oBuffer, &olen );

cipher_set_iv( &cipher_ctx, iv, 16 );

さらに、API では...write_tag...メソッドを使用してタグを個別に取得する必要があるようです。現在、認証タグではなく、CTR 暗号文のみが表示されています。

于 2015-05-13T09:39:00.290 に答える