tiny-aes-c AES CTR 128 在某些情况下切断解密字符串

tiny-aes-c AES CTR 128 cuts off decrypted string in some cases

我一直在尝试使用来自 tiny-aes-c (https://github.com/kokke/tiny-AES-c) 的 AES CTR 128 来加密随机生成的令牌,它有效,但并非始终有效。在某些情况下,加密和解密后检索到的字符串会在某个时刻被截断。这是代码:

#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,所以这很可能是我做过的其他事情的问题,但在这一点上我迷路了。有任何想法吗?提前致谢。

第一次调用 AES_CTR_xcrypt_buffer 在 CTR 模式下加密缓冲区。

缓冲区的大小仍然相同(在您的情况下为 128),但可以包含 NUL 字节。

如果缓冲区包含 NUL 字节,则 AES_CTR_xcrypt_buffer 的第二次解密调用中的 strlen 调用可能导致长度 < 128。 顺便说一句:它适用于加密不会导致缓冲区中出现 NUL 字节的情况。

因此,如果您使用 TOKEN_LENGTH 作为 length 参数调用它,解密将再次给出原始字符串:

AES_CTR_xcrypt_buffer(&ctx, in, TOKEN_LENGTH);