2015-05-13 14 views
0

Следующий тестовый код должен теоретически дать мне результат из набора тестов NIST из 58e2fccefa7e3061367f1d57a4e7455a, однако шестнадцатеричного выходных выходов 9eeaed13b5f591104e2cda197fb99eeaed13b5f591104e2cda197fb9 вместо?Не удалось получить правильный вывод из AES-128-GCM

#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 

(тест дело № 1 http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf)

ответ

2

Я вижу две немедленные ошибки:

  1. равнина размер текста вместо 10 байтов вместо байтов - это делает слишком большой зашифрованный текст и неверный тег аутентификации;
  2. IV - 12 байт, установленный в 0 вместо 16 байтов, установленный в 0 - 12, по умолчанию используется для режима GCM - это делает зашифрованный текст, если он есть, и тег аутентификации.

Эти вопросы находятся в следующих строках:

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

и

cipher_set_iv(&cipher_ctx, iv, 16); 

Кроме того, кажется, что API требует, чтобы получить метку отдельно с помощью ...write_tag... method. В настоящее время вы видите только шифрованный текст CTR, а не тег аутентификации.

+0

Благодарим вас за отзыв. Я немного смущен точкой (1). Наверняка мне нужно дать неподписанному символу длину, нет? –

+0

Действительно, нет: переменная P в тесте NIST пуста. Вы можете дать ему 'iBuffer [0]' Я полагаю. –

+0

Я заменил sizeof (iBuffer) на 0 и это, казалось, дало пустой результат. Но теперь, если я попытаюсь использовать Test Case 2 из документа NIST, где K & P - 00000000000000000000000000000000, IV 000000000000000000000000 и результат 0388dace60b6a392f328c2b971b2fe78, я получаю другой результат, хотя я изменил свой код: unsigned char iBuffer [16]; memset (iBuffer, 0x00, cipher_info-> key_length/8); cipher_update (& cipher_ctx, iBuffer, 16, oBuffer, & olen) ;. Я все запутался ;-( –