tiny-aes- c AES CTR 128 в некоторых случаях обрезает расшифрованную строку - PullRequest
0 голосов
/ 26 марта 2020

Я пытался использовать AES CTR 128 от tiny-aes- c (https://github.com/kokke/tiny-AES-c) для шифрования случайно сгенерированного токена, и это работает, но не всегда. В некоторых случаях извлеченная строка после шифрования и дешифрования в некоторый момент обрезается. Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "token_auth.h"
#include "aes.h"

uint8_t * create_token() {
  static char charset[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  uint8_t *token = malloc(sizeof(uint8_t) * (TOKEN_LENGTH + 1));
  int i = 0;

  srand ( time(NULL) );

  for (i = 0; i < TOKEN_LENGTH; i++) {    
    int pos = rand() % (int)(strlen(charset) - 1);
    token[i] = (int) charset[pos] - 0;
  }

  token[TOKEN_LENGTH] = 0;

  return token;
}

int main() {
  uint8_t key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
  uint8_t iv[16] = { 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 };
  uint8_t *in = create_token();
  printf("\nInput: %s\nSize: %d", (char *) in, strlen((char *) in));

  struct AES_ctx ctx;
  AES_init_ctx_iv(&ctx, key, iv);
  AES_CTR_xcrypt_buffer(&ctx, in, strlen((char *) in));

  AES_init_ctx_iv(&ctx, key, iv);
  AES_CTR_xcrypt_buffer(&ctx, in, strlen((char *) in));
  printf("\nDEC: %s\n", (char *) in);
  return 0;
}

TOKEN_LENGTH равен 128. В качестве примера поведения строка NM5DlWyYInbeNtEWhBxGCdEjHSv2I6FzTMffJNgudrL2UsYe6zVJMA3wvAyhHeQD18UMXckcF8gBAfPGQNqGqwdW9MgS39w7huVfIgtoqJ212SKSIdBaJP9VErOJAmQT выходит NM5DlWyYInbeNtEWhBxGCdEjHSv2 после шифрования и дешифрования. Я не очень хорош в C, так что это может быть просто проблемой с чем-то еще, что я сделал, но в этот момент я потерян. Любые идеи? Заранее спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Первый вызов AES_CTR_xcrypt_buffer шифрует буфер на месте в режиме CTR.

Буфер все еще имеет тот же размер (128 в вашем случае), но может содержать байты NUL.

Вызов strlen во втором вызове AES_CTR_xcrypt_buffer для расшифровки может, следовательно, привести к длине <128, если буфер содержит байт NUL. Кстати: он работает в тех случаях, когда шифрование не приводит к байту NUL в буфере. </p>

Так что если вы вызовете его с TOKEN_LENGTH, то при расшифровке параметра length исходная строка снова будет возвращена:

AES_CTR_xcrypt_buffer(&ctx, in, TOKEN_LENGTH);
...