将uint8_t数组(十六进制)转换为C中的字符串

将uint8_t数组(十六进制)转换为C中的字符串,c,encryption,type-conversion,uint8t,C,Encryption,Type Conversion,Uint8t,要求 我是一名开发人员,但直到一周前,我几乎没有使用C语言的经验。对于一个项目,我需要对源代码/文本文件进行加密/解密,并且需要使用C进行加密/解密 我到目前为止做了什么? 我正在为它使用库,并使用pkcs7填充实现它,如中所述 在我的代码(如下所示)中,我有一个函数my_encrypt,它加密内容并返回uint8_t数组(包含十六进制)。我需要保存它,然后从文件中读取它进行解密。我知道如何将字符串保存到文件中,但如何将uint8\t保存到文件中 为此,我需要将uint8\t转换为字符串,但在尝

要求

我是一名开发人员,但直到一周前,我几乎没有使用C语言的经验。对于一个项目,我需要对源代码/文本文件进行加密/解密,并且需要使用C进行加密/解密

我到目前为止做了什么?

我正在为它使用库,并使用pkcs7填充实现它,如中所述

在我的代码(如下所示)中,我有一个函数
my_encrypt
,它加密内容并返回
uint8_t
数组(包含十六进制)。我需要保存它,然后从文件中读取它进行解密。我知道如何将字符串保存到文件中,但如何将
uint8\t
保存到文件中

为此,我需要将
uint8\t
转换为字符串,但在尝试了多个解决方案后,我无法进行转换

问题

如何将
uint8\u t
数组(包含十六进制)转换为C中的字符串

我的代码

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <stdlib.h>

#define CBC 1
#define DECRYPT 0;
#define ENCRYPT 1;

#include "aes.h"
#include "pkcs7_padding.h"

const uint8_t * my_encrypt(char *report) {
    //Initialization Vector
    uint8_t iv[]  = { 0x75, 0x52, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x21, 0x21 };

    uint8_t i;
//    char* report = "my super secret thing that needs to remain that way!";
    char* key = "thisIstheKey";
    int dlen = strlen(report);
    int klen = strlen(key);

    printf("THE PLAIN TEXT STRING = ");
    for (i=0; i<dlen;i++){
        printf("%c", report[i]);
    }
    printf("\n");

    //Proper Length of report
    int dlenu = dlen;
    if (dlen % 16) {
        dlenu += 16 - (dlen % 16);
        printf("The original length of the STRING = %d and the length of the padded STRING = %d\n", dlen, dlenu);
    }

    //Proper length of key
    int klenu = klen;
    if (klen % 16) {
        klenu += 16 - (klen % 16);
        printf("The original length of the KEY = %d and the length of the padded KEY = %d\n", klen, klenu);
    }

    // Make the uint8_t arrays
    uint8_t hexarray[dlenu];
    uint8_t kexarray[klenu];

    // Initialize them with zeros
    memset( hexarray, 0, dlenu );
    memset( kexarray, 0, klenu );

    // Fill the uint8_t arrays
    for (int i=0;i<dlen;i++) {
        hexarray[i] = (uint8_t)report[i];
    }
    for (int i=0;i<klen;i++) {
        kexarray[i] = (uint8_t)key[i];
    }

    int reportPad = pkcs7_padding_pad_buffer( hexarray, dlen, sizeof(hexarray), 16 );
    int keyPad = pkcs7_padding_pad_buffer( kexarray, klen, sizeof(kexarray), 16 );

    printf("The padded STRING in hex is = ");
    for (i=0; i<dlenu;i++){
        printf("%02x",hexarray[i]);
    }
    printf("\n");

    printf("The padded key in hex is = ");
    for (i=0; i<klenu;i++){
        printf("%02x",kexarray[i]);
    }
    printf("\n");

    // In case you want to check if the padding is valid
    int valid = pkcs7_padding_valid( hexarray, dlen, sizeof(hexarray), 16 );
    int valid2 = pkcs7_padding_valid( kexarray, klen, sizeof(kexarray), 16 );
    printf("Is the pkcs7 padding valid  report = %d  |  key = %d\n", valid, valid2);

    //start the encryption
    struct AES_ctx ctx;
    AES_init_ctx_iv(&ctx, kexarray, iv);

    // encrypt
    AES_CBC_encrypt_buffer(&ctx, hexarray, dlenu);

    printf("the encrypted STRING = ");
    for (i=0; i<dlenu;i++){
        printf("%02x",hexarray[i]);
    }
    printf("\n");

    return hexarray;
}

int main(int argc, char *argv[]) {
    // File pointer
    FILE *input_file;

    int operation;

    char * input_file_buffer = 0;
    long input_file_length;

    // ////////////////////////////////////////////////////////
    // Read command line arguments
    // ////////////////////////////////////////////////////////

    // Make sure proper command params are supplied
    if (argc != 3) {
        printf("Usage: %s encrypt/decrypt filename\n", argv[0]);
        return -1;
    }

    // Define operation type
    if (strcmp(argv[1], "encrypt") == 0) {
        operation = ENCRYPT;
    } else if (strcmp(argv[1], "decrypt") == 0) {
        operation = DECRYPT;
    }

    // ////////////////////////////////////////////////////////
    // Open File contents
    // ////////////////////////////////////////////////////////

    // Open input_file to encrypt/decrypt.
    input_file = fopen(argv[2], "rb");
    if (!input_file) {
        fprintf(stderr, "ERROR: '%s' file fopen error: %s\n", argv[2], strerror(errno));
        return errno;
    }

    // Read contents of file in buffer
    fseek(input_file, 0, SEEK_END);
    input_file_length = ftell (input_file);
    fseek(input_file, 0, SEEK_SET);
    input_file_buffer = malloc (input_file_length);
    if (input_file_buffer)
    {
        fread(input_file_buffer, 1, input_file_length, input_file);
    }

    // Close input_file
    fclose(input_file);

    // We have contents of file in input_file_buffer, let's print them.
    printf("File contents:\n-------\n%s\n", input_file_buffer);

    // Let's encrypt input_file_buffer
    uint8_t result = 0;
    result = my_encrypt(input_file_buffer);

    // Convery result to string.
    printf("main: Encrypted File contents:\n-------\n%d\n", result);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义CBC 1
#定义解密0;
#定义加密1;
#包括“aes.h”
#包括“pkcs7_padding.h”
const uint8\u t*my\u encrypt(字符*报告){
//初始化向量
uint8_t iv[]={0x75、0x52、0x5f、0x69、0x6e、0x74、0x65、0x72、0x65、0x73、0x74、0x69、0x6e、0x67、0x21、0x21};
uint8_t i;
//char*report=“我的超级秘密需要保持这种状态!”;
char*key=“thisIstheKey”;
int dlen=strlen(报告);
int-klen=strlen(键);
printf(“纯文本字符串=”);

对于(i=0;iIs这不是XY问题?如果您的目标是存储uint8_t数组,则应存储uint8_t数组。不需要单独将其转换为字符串。十六进制字符串是人类可读的字节解释。
printf
语句的输出为十六进制,而
uint_8
a中的输入为十六进制rray是二进制的。因此,如果您将
printf
的输出放在一个文件中,那么您就完成了。但是,文件处理二进制非常好;您只需要六位小数供人使用。啊,让我尝试将二进制存储在文件中。将返回结果。好的,要测试,有一些Posix实用程序,例如
hextump-C
(或仅
hd
)以十六进制形式查看二进制文件的内容。许多编辑器/IDE还可以选择使用十六进制查看二进制文件的内容。我不清楚“uint8_t数组(包含十六进制)”是什么意思--它是一个uint8_t数组--也就是一个无符号字节数组。您可以通过在代码中将字节的值表示为十六进制来分配它们,但是如果您使用了“u”而不是0x75,则该数组将包含相同的值。