【问题标题】:tiny-aes-c AES CTR 128 cuts off decrypted string in some casestiny-aes-c AES CTR 128 在某些情况下会切断解密的字符串
【发布时间】:2020-03-26 18:28:05
【问题描述】:

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

【问题讨论】:

    标签: c encryption aes


    【解决方案1】:

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

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

    因此,如果缓冲区包含 NUL 字节,则第二次调用 AES_CTR_xcrypt_buffer 进行解密时的 strlen 调用可能导致长度

    所以如果你用 TOKEN_LENGTH 调用它作为length 参数解密将再次给出原始字符串:

    AES_CTR_xcrypt_buffer(&ctx, in, TOKEN_LENGTH);
    

    【讨论】:

    • 非常感谢!它确实解决了它。假设我需要将加密的输出放到一个文件中,我需要知道它的大小才能这样做并在另一个点检索它?
    • 是的,例如,您可以使用文件的大小,只有 strlen 不能使用,因为加密的数据可能包含 NUL 字节,它是 C 字符串的字符串结束终止符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多