[英]Libgcrypt in C returning 42
我想以此开头,我是C语言的新手,尤其是使用了和libgcrypt一样大的lib,因此,如果它非常简单,请理解。
因此,我一直在尝试仅加密一些文本,以便从某个启动板开始,这样,在进行字节加密之前,我会获得更好的信心,这是该小应用程序的最终目标之一,如果您愿意这样称呼。 我一直在关注此问题 ,但仍在努力使其正常工作。 真正令我困惑的部分是,我将其传递给out缓冲区,该缓冲区的大小已与in文本的大小匹配。 我确实觉得很奇怪,尽管该站点通常告诉我使用AES加密时输出的字节数很大,但该站点告诉我使输出缓冲区的大小与输入的大小相同。 也许我错过了一些经验丰富的人可以帮助我的东西,我现在已经阅读了至少3-4次他们的代码,我觉得这一定是我在这里缺少的超级简单的东西。
client.c
#include "client.h"
void printGCRYPTError(gcry_error_t err) {
if (err) {
{
fprintf (stderr, "Failure: %s/%s\n",
gcry_strsource (err),
gcry_strerror (err));
fprintf (stdout, "Failure: %s/%s\n",
gcry_strsource (err),
gcry_strerror (err));
}
}
}
char* Encrypt(char* in, char* key, char* iv){
size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER);
if(strlen(key) != keyLength) {
printf("Invalid Key Size. Expected %zu got %lu\n", keyLength, strlen(key));
return NULL;
}
if(strlen(iv) != blkLength) {
printf("Invalid BLK/IV Size. Expected %zu got %lu\n", blkLength, strlen(iv));
return NULL;
}
gcry_cipher_hd_t handle;
gcry_error_t err = 0;
size_t inLen = strlen(in)+1;
char * out = malloc(inLen);
// Open
err = gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_C_MODE, 0);
printGCRYPTError(err);
// Set Key
err = gcry_cipher_setkey(handle, key, keyLength);
printGCRYPTError(err);
// Set IV
err = gcry_cipher_setiv(handle, iv, blkLength);
printGCRYPTError(err);
// Enc
printf("Encrypting...\n");
err = gcry_cipher_encrypt(handle, out, inLen, in, inLen);
printGCRYPTError(err);
printf("Encrypted.\n");
gcry_cipher_final(handle);
//Out
printf("Plaintext Message: %s\n", in);
printf("Encrypted Message: ");
int index = 0;
for (index = 0; index<inLen; index++) {
printf("%02X", (unsigned char)out[index]);
}
printf("\n");
// Cleanup!
gcry_cipher_close(handle);
// Return
return out;
}
char* Decrypt(char* in, char* key, char* iv){
size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER);
if(strlen(key) != keyLength) {
printf("Invalid Key Size. Expected %zu got %lu\n", keyLength, strlen(key));
return NULL;
}
if(strlen(iv) != blkLength) {
printf("Invalid BLK/IV Size. Expected %zu got %lu\n", blkLength, strlen(iv));
return NULL;
}
gcry_cipher_hd_t handle;
gcry_error_t err = 0;
size_t inLen = strlen(in);
char * out = malloc(inLen);
// Open
err = gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_C_MODE, 0);
printGCRYPTError(err);
// Set Key
err = gcry_cipher_setkey(handle, key, keyLength);
printGCRYPTError(err);
// Set IV
err = gcry_cipher_setiv(handle, iv, blkLength);
printGCRYPTError(err);
// Dec
printf("Decrypting...\n");
err = gcry_cipher_decrypt(handle, out, inLen, in, inLen);
printGCRYPTError(err);
printf("Decrypted.\n");
gcry_cipher_final(handle);
//Out
printf("Encrypted Message: ");
int index = 0;
for (index = 0; index<inLen; index++) {
printf("%02X", (unsigned char)out[index]);
}
printf("\n");
printf("Decrypted Message: %s\n", out);
// Cleanup!
gcry_cipher_close(handle);
// Return
return out;
}
int main() {
//aesTest();
char* encrypted = Encrypt("My test message", "sBK0hcXddz6mIKEsBK0hcXddz6mIKEAS", "sBK0uhSAUSUSHKES");
char* decrypted = Decrypt(encrypted, "sBK0hcXddz6mIKEsBK0hcXddz6mIKEAS", "sBK0uhSAUSUSHKES");
}
控制台输出
Encrypting...
Encrypted.
Plaintext Message: My test message
Encrypted Message: 153C01DD7821E5113C25D2038F3644F7
Decrypting...
Failure: gcrypt/Invalid length
Failure: gcrypt/Invalid length
Decrypted.
Encrypted Message: 0000000000001000000000000000101400
Decrypted Message:
感谢您的光临!
根据libgcrypt的文档:
某些加密模式要求在将最终数据块传递给此函数之前使用gcry_cipher_final。
因此,我怀疑您需要做两件事:
检查gcry_cipher_encrypt
产生的错误代码结果是否与先前的函数调用方式一致。
调用加密后,调用gcry_cipher_final(handle)
-假定您正在对小于密码块长度的缓冲区进行一次加密。
如selbie所建议,检查gcry_cipher_encrypt
返回的错误很有用:它说“失败:gcrypt /无效长度”。
根本原因似乎是inLen
:
size_t inLen = strlen(in);
...
err = gcry_cipher_encrypt(handle, out, inLen, in, inLen);
printGCRYPTError(err);
gcry_cipher_final(handle);
返回(预期?)输出,
Message: My test message!
Encrypted Message = AEDBBB645CA54F16B5A279D77772A97B
除了关键问题之外,我还需要在加密之前将填充添加到我的AES纯文本中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.