- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想先说明一下,我是 C 的新手,尤其是使用像 libgcrypt 这样大的库,所以如果它非常简单,请理解。
所以,我一直在尝试加密一些文本,只是为了有点像启动板,这样我就可以在加密字节之前获得更好的信心,这是这个小应用程序的最终目标之一,如果你想打电话它那个。我一直在关注this ,但仍在努力让它发挥作用。真正让我感到困惑的部分是我将其大小与输入文本相匹配的输出缓冲区传递给它。我确实觉得奇怪,这个站点告诉我使输出缓冲区的大小与输入相同,即使通常在使用 AES 加密时输出的字节数很大。也许我错过了一些更有经验的人可以帮助我的东西,我现在至少阅读了他们的代码 3-4 次,我觉得它一定是我在这里错过的非常简单的东西。
客户端.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 的文档:
Some encryption modes require that gcry_cipher_final is used before the final data chunk is passed to this function.
所以我怀疑你需要做两件事:
检查 gcry_cipher_encrypt
的错误代码结果是否与您执行先前函数调用的方式一致。
调用加密后调用 gcry_cipher_final(handle)
- 假设您正在对小于密码 block 长度的缓冲区进行一次性加密。
关于c - C 中的 Libgcrypt 返回 42,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56266972/
来自 libgcrypt 手册: Libgcrypt uses a concept known as secure memory, which is a region of memory set as
如果我在.lib(library)文件中找到了未解析的外部符号,该怎么办。如果我在.c或.cpp中发现了无法解析的外部符号,则可以对其进行修复。但是,当我在.lib(library)文件中找到未解析的
我正在使用 Libgcrypt 进行一些测试,当我使用 valgrind 检查内存使用情况时,退出时有 3,200 个字节正在使用。 我尝试过使用 valgrind --leak-check=full
我一直在努力理解如何正确使用 libgcrypt,并尽力编写了一些代码。尽管如此,我正在尝试使用上述库加密(AES 256)和解密文件。用户将输入文件名作为命令行参数。加密的文件将保存为第二个文件 (
我正在尝试在两个不同的组件中执行加密和解密(Rijndael 256,ecb 模式): 1. PHP - 服务器端(使用 mcrypt) 2. C++ - 客户端(使用 gcrypt) 当客户端无法正
我正尝试在带有 imx6 的板上为 ElinOS 交叉编译 GPG。我在编译 libgcrypt 时遇到问题。首先,这是我的工作: export PATH=/opt/elinos/cdk/arm/v7
我正在开发对文件进行 aes256-cbc 加密的简单软件。我正在使用 GNU/Linux 和 libgcrypt-1.5.0。 IV 是使用 OpenSSL rand 函数随机生成的,IV 存储在输
我有一个使用 libgcrypt 的 CTR 模式实现用 AES-256 加密的文件。 我希望能够分部分解密文件(例如,在不解密整个文件的情况下解密 20 个块中的 5-10 个块)。 我知道通过使用
我正在尝试创建一个由具有主私钥的对等点控制的对等网络,其中一部分是批准对等点进行连接 以下代码假设采用公钥,对其进行签名并将其发送给对等方,以便它可以检查其是否有效以及是否在其批准的对等方列表中 gc
我正在使用这个已解决的帖子作为引用,但似乎无法获得相同的结果:AES128 in libgcrypt not encrypting 当我将字符串打印到控制台时,我得到了垃圾字符。我认为这可能是由于 '
当我编译一个定义了 GCRYPT_NO_DEPRECATED 的示例程序时,我收到以下 6 条警告: /usr/local/Cellar/libgcrypt/1.5.0/include/gcrypt.
我一直在尝试为我的一个小型密码学项目使用 libgcrypt,但我似乎无法正确实现加密/解密。以下类及其用法。 #include #include #include #include #inc
我正在使用 Libgcrypt 和 Elgamal 来加密一个字节块,但我遇到了两个问题: 当我不使用填充并且我的字节块以零字节开始时,我在解密过程中丢失了第一个字节; 如果我使用填充,加密效果很好,
我正在使用 gcrypt,但我的编译器似乎无法找到它。这是我的 makefile。 function.c是一个函数源文件,包含我定义的函数;我还写了一个带有函数声明的头文件miao.h,gcrypt.
在使用 CCM 操作模式和 AES 算法时,我在 Libgcrypt 中加密/解密简单的 16 字节消息时遇到问题。在Libgcrypt的文档中我找不到为CCM设置哪些参数(我应该设置IV还是计数器?
在我的程序中,我最初向其中添加了 json-c,并且缺少一些与 libgcrypt 相关的依赖项。现在,我收到了 libgcrypt 的这些错误,这些错误对我来说没有任何意义。有没有人见过这些或者能够
我配置并编译了 libgpg-error 和 libgcrypt 但无法安装(make install),因为我没有 root 权限。 当我尝试配置 libgnutls 时,出现此错误。 tactus
我正在尝试使用来自 libgcrypt 的 AES256 加密和解密文件。(参见 doc) 为了生成 256 位 key ,我使用 SHA256 散列用户定义的字符串 (argv[1])。这工作得很好
我想先说明一下,我是 C 的新手,尤其是使用像 libgcrypt 这样大的库,所以如果它非常简单,请理解。 所以,我一直在尝试加密一些文本,只是为了有点像启动板,这样我就可以在加密字节之前获得更好的
由于目标平台的 C 语言限制,我需要在 libgcrypt 中通过 Crypto++ 解密加密数据。所以我决定使用 libgcrypt,因为它支持 AES128 和 GCM 模式。 在 Crypto+
我是一名优秀的程序员,十分优秀!