EVP_AES_128_CTR - PullRequest
       2

EVP_AES_128_CTR

0 голосов
/ 16 октября 2018

Как реализовать EVP AES 128 CTR с использованием библиотеки openssl.Как я должен предоставить значение счетчика, чтобы проверить мой алгоритм со стандартными векторами теста, указанными в https://tools.ietf.org.

Пожалуйста, найдите фрагмент кода ниже:

int AES_encrypt(const int nrounds, uint8_t *key_data, const int key_data_len, uint8_t *plaintext, int *len, uint8_t *ciphertext)
{
int rc = -1;
  int c_len = *len;
  if(key_data_len <= 0 || key_data_len < AES_BITMODE){
    lowLog("%s","Insufficient AES key length!");
    return rc;
  }
  if(c_len <= 0 || (c_len%8) != 0){
    lowLog("%s","Insufficient plaintext length!");
    return rc;//insufficient data length
  }

  //"opaque" decryption ctx structure that libcrypto uses to record status of enc/dec operations
  EVP_CIPHER_CTX *e_ctx = EVP_CIPHER_CTX_new();
  int i;// nrounds = 5;
  uint8_t key[AES_BITMODE]={}, iv[AES_BITMODE]={};
  /* 2 bytes to salt, TODO check complex/random salt which can be used*/
  uint8_t salt[] = {0x34, 0xff};


  /* AES Initialization++
   * Gen key & IV for AES 128 CBC mode. A SHA1 digest is used to hash the supplied key material.
   * nrounds is the number of times the we hash the material. More rounds are more secure but
   * slower.
   */
  i = EVP_BytesToKey(EVP_aes_128_ctr(), EVP_sha1(), salt, key_data, key_data_len, nrounds, key, iv);
  if (i != 16) {
    lowLog("Key size is %d bits - should be 128 bits\n", i*8);
    return rc;
  }

  EVP_CIPHER_CTX_init(e_ctx);
  EVP_EncryptInit_ex(e_ctx, EVP_aes_128_ctr(), NULL, key, iv);
  //--

  /*IMPORTANT: Disable padding since we need to get ciphertext exact as size of plaintext
    Ensure that plaintext to be provided everytime is exact 16 bytes or multiple of 16 bytes
  */
  /*unsigned char *ciphertext = (unsigned char*)malloc(c_len);*/
  EVP_CIPHER_CTX_set_padding(e_ctx, 0); 

  /* update ciphertext, c_len is filled with the length of ciphertext generated,
    *len is the size of plaintext in bytes */
  if(EVP_EncryptUpdate(e_ctx, ciphertext, &c_len, plaintext, *len) == EVP_FAILURE)
    return rc;

  /*Refer below DOC NOTE from openssl:-
  If padding is disabled then EVP_EncryptFinal_ex() will not encrypt any more data and
  it will return an error if any data remains in a partial block:
  that is if the total data length is not a multiple of the block size.*/
  /*if(EVP_EncryptFinal_ex(e_ctx, ciphertext+c_len, &f_len) == EVP_FAILURE)
    return rc;*/

  EVP_CIPHER_CTX_free(e_ctx);
  //*len = c_len + f_len;
  //cout<<"cipher len::"<<c_len<<endl;//ciphering length check
return 0;
}
  1. Мне нужно использовать раунды для режима AES CTR.Для этого же я использую EVP_BytesToKey.Это правильный способ сделать это.Если нет, то какова альтернатива для обеспечения раундов в моем алгоритме.
  2. Какой простой способ проверить мой алгоритм CES AES.Когда я ссылался на тестовые векторы IETF (https://tools.ietf.org/html/draft-moskowitz-aes128-ctr-00#section-9), один из входов был счетчиком. Как предоставить счетчик в качестве входа для моего кода для проверки с помощью тестовых векторов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...