如何将gcrypt库中gcry_cipher_encrypt的返回值复制到一个变量

C++, how to copy the return value of gcry_cipher_encrypt in gcrypt library to a variable?

本文关键字:复制 变量 一个 返回值 gcrypt 库中 gcry encrypt cipher      更新时间:2023-10-16

在下面的代码中,它使用了gcry_cipher_encrypt。在代码的末尾,它以十六进制值字符串的形式输出encBuffer中的内容。我需要把它放在像char[], char*或string这样的变量中,然后使用它。

根据gcrypt, encBuffer的手册,函数的第二项应该是一个无符号char*类型的变量。我认为它应该指向一个无符号字符数组。但是当我这样做的时候:

for(int i = 0; i < txtLength-1;i++){
   cout<<encBuffer[i];
}

得到大量代码。我怎么能得到可读的内容从encBuffer请?非常感谢。

#include <stdio.h>
#include <gcrypt.h>
int main () {
gcry_error_t     gcryError;
gcry_cipher_hd_t gcryCipherHd;
size_t           index;
char * salsaKey = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; // 32 bytes
char * iniVector = "AAAAAAAA"; // 8 bytes
gcryError = gcry_cipher_open(
    &gcryCipherHd, // gcry_cipher_hd_t *
    GCRY_CIPHER_SALSA20,   // int
    GCRY_CIPHER_MODE_STREAM,   // int
    0);            // unsigned int
if (gcryError)
{
    printf("gcry_cipher_open failed:  %s/%sn",
           gcry_strsource(gcryError),
           gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_open workedn");
gcryError = gcry_cipher_setkey(gcryCipherHd, salsaKey, 32);
if (gcryError)
{
    printf("gcry_cipher_setkey failed:  %s/%sn",
           gcry_strsource(gcryError),
           gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_setkey workedn");
gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, 8);
if (gcryError)
{
    printf("gcry_cipher_setiv failed:  %s/%sn",
           gcry_strsource(gcryError),
           gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_setiv workedn");
size_t txtLength = 101;
char * encBuffer = malloc(txtLength);
char * textBuffer = malloc(txtLength);
memset(textBuffer, 0, 101);
gcryError = gcry_cipher_encrypt(
    gcryCipherHd, // gcry_cipher_hd_t
    encBuffer,    // void *
    txtLength,    // size_t
    textBuffer,    // const void *
    txtLength);   // size_t
if (gcryError)
{
    printf("gcry_cipher_decrypt failed:  %s/%sn",
           gcry_strsource(gcryError),
           gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_decrypt workedn");
printf("encBuffer = ");
for (index = 0; index<txtLength-1; index++)
    printf("%02X", (unsigned char)encBuffer[index]);
printf("n");
return 0;
}

我使用malloc创建了以下函数(因为您的代码使用malloc)。

char *buffer2hex(char *encBuffer, int txtLength){
    char *encHexText = (char *)malloc(txtLength*2+1), 
         *eht = encHexText;
    for (int i = 0; i < txtLength; i++){
        int c = (unsigned char)encBuffer[i];
        #define tohex(n) ((n)>9?(n)-10+'A':(n)+'0')
        *eht++ = tohex(c>>4);
        *eht++ = tohex(c&0xf);
        #undef tohex
    }
    *eht = '';
    return encHexText; 
}

在方法的末尾,你可以这样调用它:

    char *hex = buffer2hex(encBuffer, txtLength);
    printf("%sn", hex); // Use it
    free(hex);           // and free it!