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);
我一直在尝试使用来自 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);