我正在尝试使用gcrypt将简单加密作为txt文件。当我执行命令gcry_cipher_encrypt
时,我收到以下错误:
gcry_strsource => User defined source 1
gcry_strerror => Invalid length
当我使用一个txt文件的内容时会发生这种情况,如果我在代码中对文本内容进行硬编码,这个函数有效,可能的原因是什么?
文字文件内容
test test test test test
加密代码:
void myEncrypt::aesEncrypt(char *txtInput, int txtInputSize, char *txtOutput){
gcry_error_t gcryError;
gcry_cipher_hd_t gcryCipherHd;
size_t index;
size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER);
//char * txtBuffer = "123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ 123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ";
char * txtBuffer = txtInput;
size_t txtLength = strlen(txtBuffer)+1; // string plus termination
char * encBuffer = (char *)malloc(txtLength);
char * outBuffer = (char *)malloc(txtLength);
char * aesSymKey = "one test AES key"; // 16 bytes
char * iniVector = "a test ini value"; // 16 bytes
gcryError = gcry_cipher_open(
&gcryCipherHd, // gcry_cipher_hd_t *
GCRY_CIPHER, // int
GCRY_C_MODE, // int
0); // unsigned int
if (gcryError)
{
printf("gcry_cipher_open failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_open worked\n");
gcryError = gcry_cipher_setkey(gcryCipherHd, aesSymKey, keyLength);
if (gcryError)
{
printf("gcry_cipher_setkey failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_setkey worked\n");
gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
if (gcryError)
{
printf("gcry_cipher_setiv failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_setiv worked\n");
gcryError = gcry_cipher_encrypt(
gcryCipherHd, // gcry_cipher_hd_t
encBuffer, // void *
txtLength, // size_t
txtBuffer, // const void *
txtLength); // size_t
if (gcryError)
{
printf("gcry_cipher_encrypt failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_encrypt worked\n");
gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
if (gcryError)
{
printf("gcry_cipher_setiv failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_setiv worked\n");
gcryError = gcry_cipher_decrypt(
gcryCipherHd, // gcry_cipher_hd_t
outBuffer, // void *
txtLength, // size_t
encBuffer, // const void *
txtLength); // size_t
if (gcryError)
{
printf("gcry_cipher_decrypt failed: %s/%s\n",
gcry_strsource(gcryError),
gcry_strerror(gcryError));
return;
}
printf("gcry_cipher_decrypt worked\n");
printf("keyLength = %d\n", keyLength);
printf("blkLength = %d\n", blkLength);
printf("txtLength = %d\n", txtLength);
printf("aesSymKey = %s\n", aesSymKey);
printf("iniVector = %s\n", iniVector);
printf("txtBuffer = %s\n", txtBuffer);
printf("encBuffer = ");
for (index = 0; index<txtLength; index++)
printf("%02X", (unsigned char)encBuffer[index]);
printf("\n");
printf("outBuffer = %s\n", outBuffer);
// clean up after ourselves
gcry_cipher_close(gcryCipherHd);
free(encBuffer);
free(outBuffer);
}
答案 0 :(得分:2)
嗯......我不知道libgcrypt,但是......
在this page中,在gcry_cipher_encrypt()
函数的说明中,我读了
根据所选算法和加密模式,缓冲区的长度必须是块大小的倍数。
如果我理解得很好,那么您使用AES作为算法,因此,根据各种来源(例如wikipedia),AES的块大小为16字节。
如果查看原始txtBuffer
,可以看到63字节(9个数字,26 + 26个字母,2个空格),所以(为终端零添加+1){{1} }是64,是16的精确倍数。
您的文字为25个字节,因此txtLength
如果为26,则不是16的倍数。
En passant:您使用的是C ++,因此我强烈建议您避免使用texLength
并使用malloc()
;或者(更好,恕我直言)new []
std::string
,reserve()
和c_str()
。
我想你应该使用data()
作为中间分配的缓冲区。
使用txtBuffer
解决方案,我想您应该以这种方式修改代码
new []
p.s。:谨慎,代码未经过测试。
p.s.2:抱歉我的英语不好。