首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C返回42中的Libgcrypt

C返回42中的Libgcrypt
EN

Stack Overflow用户
提问于 2019-05-23 01:30:38
回答 3查看 243关注 0票数 2

首先,我对C很陌生,尤其是使用了像libgcrypt这样大的库,所以如果它非常简单,请理解。

所以,我一直在试着加密一些文本,这样我才能在加密字节之前获得更好的自信,这是这个小应用的最终目标之一,如果你愿意的话。我一直在关注,但仍然在努力让它发挥作用。真正让我困惑的部分是,我正在传递它的输出缓冲区,它的大小已经与文本的大小相匹配。我确实觉得奇怪的是,这个站点告诉我要使输出缓冲区与输入相同大小,尽管通常在用AES加密时,输出在字节上是大的。也许我错过了一些更有经验的人可以帮助我的东西,我已经至少读过他们的代码3-4次了,我觉得这一定是我在这里错过的非常简单的东西。

编辑

client.c

代码语言:javascript
复制
#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");
}

控制台输出

代码语言:javascript
复制
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: 

谢谢你找我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-23 03:05:17

除了关键问题外,我还需要在加密前将填充添加到AES明文中。

票数 0
EN

Stack Overflow用户

发布于 2019-05-23 01:50:16

根据利布地窖的文档

有些加密模式要求在将最终数据块传递给此函数之前使用gcry_cipher_final。

所以我怀疑你需要做两件事:

  1. 检查gcry_cipher_encrypt的错误代码结果,与您之前函数调用的方式一致。
  2. 调用加密后调用gcry_cipher_final(handle) -假定您正在对一个小于密码块长度的缓冲区进行一次加密。
票数 0
EN

Stack Overflow用户

发布于 2019-05-23 02:07:04

正如塞尔比所建议的,检查gcry_cipher_encrypt返回的错误很有用:它写着"Failure: gcrypt/无效长度“。

根本原因似乎是inLen

代码语言:javascript
复制
size_t inLen = strlen(in);
...
err = gcry_cipher_encrypt(handle, out, inLen, in, inLen);
printGCRYPTError(err);
gcry_cipher_final(handle);

返回(预期的?)产出,

代码语言:javascript
复制
Message: My test message!
Encrypted Message = AEDBBB645CA54F16B5A279D77772A97B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56266972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档