问题标签 [libgcrypt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
959 浏览

c - libgcrypt 安全内存

从 libgcrypt 手册:

Libgcrypt 使用称为安全内存的概念,它是为存储敏感数据而预留的内存区域。因为这样的内存是稀缺资源,所以需要提前设置为固定大小。此外,大多数操作系统对如何使用安全内存都有特殊要求。例如,可能需要将应用程序安装为“setuid(root)”以允许分配此类内存。[...] 如果您必须保护您的密钥或内存中的其他信息不被换出到磁盘并启用自动覆盖已使用和释放的内存,您需要 [...]

我对这种安全内存的工作方式有点困惑。
我正在开发一个执行 aes256-cbc 文件加密的软件,它还计算 IV+CIPHERTEXT 的 MAC(带有 sha512 的 hmac),所以我必须使用安全内存来存储敏感信息。
我对“安全内存”的概念不了解的是:

  1. 假设我有这个:unsigned char *key; key = malloc(32);。库如何知道该变量希望安全内存被“分配”?
  2. “释放内存的自动覆盖”意味着free(key)将被删除,所以我不需要在释放指针之前对内存进行 memset 吗?
0 投票
1 回答
444 浏览

c - 使用 gcry_malloc_secure 时 C 中的内存管理

我正在使用 GNU/Linux 下的 libgcrypt 1.5.0 开发一个小型的 aes256-cbc 文件加密软件。

我对交换到磁盘的安全内存和数据有疑问。

假设我有这个代码:

这两件事也做有用和必要吗?

1)不允许该内存被分页: mlock(crypto_key, size)

2)为了防止信息被写入核心转储:

0 投票
0 回答
3661 浏览

c - 为 Mingw 构建/链接 libgcrypt

我想在我的程序中实现 libgcrypt 的一些功能,但它目前在 Windows、OSX 和 Linux(Arch/Xubuntu)上运行,所以我只有在能够为所有三个平台构建它的情况下才能真正做到这一点。在 OSX 和 Linux 上我没有问题。

我从 github 页面获取了libgcryptlibgpg-error的源代码,并且我已经在 Linux 和 OSX 上成功构建并运行了这些库,所以我知道我的测试代码是有效的(我现在在 Windows 上遇到了问题带MinGW)。

我在 Xubuntu 上做了以下事情(在 Arch 上类似,但使用 pacman 而不是 apt-get):

获取交叉编译工具链和

构建,它成功地在 home/myuser/w32root/ 中构建了这些文件:

  • libgcrypt.a
  • libgcrypt.def
  • libgcrypt.dll.a
  • libgcrypt.la
  • libgpg-error.dll.a
  • libgpg-error.la
  • 包括/

    • gcrypt.h
    • gcrypt-module.h
    • gpg-error.h

我将这些文件带到 Windows,并尝试编译测试代码(本地命名为 main.c)

但我得到未定义的引用错误,导致我得出的结论是库没有正确链接(最初只使用 libgcrypt.a),所以我查了一些东西,发现有些库需要一组文件,如 .a, .定义,等。工作,所以我把它们都放在 C:\Mingw\lib 中,看看它是否有所作为;它没有。以下在查找要链接的库文件时也保持沉默,但没有解决未定义的引用:

所以我不确定从这里去哪里。自述文件不会过多地涉及交叉编译,例如在 Windows 端复制和链接哪些文件。任何指针(我可能错过的文档?)表示赞赏!非常感谢您阅读我的文字墙。

0 投票
2 回答
1114 浏览

c - 打印 MPI 的 unsigned int (base 10 / decimal) 值

我正在尝试确认/获取十六进制 mpi 值的无符号整数(基数 10/十进制)值。我正在使用以下代码:

我得到以下结果:

我会在“结果:”行打印实际的无符号整数(以 10 为基数/十进制)值。

私钥取自我正在尝试使用的 Off-The-Record Pidgin 插件。

编辑

任何人都可以确认实际的无符号整数(基数 10/十进制)值应该是

415325779662433871844955547383752003988573073626

我可能会更新程序以使用此值在 gcrypt 中创建一个新的 mpi,并查看 HEX 值是否与我已有的相同。我今天晚些时候会这样做。

编辑 2

所以我正在尝试执行以下操作来打印上述 int 值的 HEX 值。出了点问题:

输出是:

编辑 3

我稍微更新了帖子,基本上我正在尝试打印由 gcrypt 库生成的十六进制值的 base10 十进制值。我正在寻找这个值来确认我为读取这些值所做的实现。我正在寻找一个 gcrypt 函数来实现这一点。似乎 gcrypt 不支持这个?

0 投票
1 回答
1306 浏览

cryptography - 如何使用 C# Bouncy Castle 解密使用 Libgcrypt 原始标志加密的 AES 密钥

摘要: 我正在尝试解密(并最终加密并返回)AES128 加密的文件。AES 密钥使用 libcrypt 的 RSA 提供程序进行加密。当我尝试使用 C# 和 BouncyCastle 在 Windows 7 上解密 AESKey 时,当我调用“ProcessBlock”时会引发“块截断”错误。我尝试将数据转换为 BigEndian,当我尝试创建 RsaKeyParameters 时,我会得到“不是有效的 RSA 指数”。

加密是在 linux 系统上使用 libgcrypt 1.2x 完成的。我认为这是一个填充问题,因为这段代码表明没有使用填充。 gcry_sexp_build(&PlainKeyExp, NULL, "(data (flags raw) (value %s))", AESKey );

不幸的是,我无法更改原始系统。我在下面包含代码示例和键以提供帮助。在过去的 3 天里,这一直让我发疯。我已经搜索了 interwebz 并没有找到解决方案。预先感谢您的帮助。

原始代码片段

解码代码片段

0 投票
1 回答
714 浏览

c# - 使用 256 位密钥调用 aes128 密码时,libgcrypt 有何不同?

这是我之前的问题(RSA 解密)的延续。

编辑:下面的答案清晰简洁。我在下面添加了一些示例代码,这些代码帮助我验证了我认为正在发生的事情。我今天会测试并回帖。客户端应用程序正在创建一个 256 位密钥,但是当它调用 gcry_cipher_setkey 时,它使用从算法返回的密钥长度。所以我猜测 setkey 正在将 256 位密钥截断为 128 位。很容易测试出来。

我正在尝试解密使用带有 aes128 / cbc / 无填充的 libgcrypt 加密的文件。有两个不同的应用程序正在执行加密,这两个我都无法控制。一种是使用 128 位 AES 密钥,另一种是使用 256 位密钥。否则,所有内部调用都相同。

编辑:这是伪加密代码:编辑 2:固定顺序并为未来用户添加评论:

所以在我的 C# 代码中,在我开始解密之前我会这样做:

我正在使用 C# & bouncycastle 来解密文件。我成功解密了使用 128 位密钥加密的文件。但是当密钥为 256 位时失败。失败意味着输出是乱码。

我已经验证了两个来源的 AES 密钥都被正确解密了。

我的问题是当密钥是 256 位时,Libgrypt 有什么不同?或者这甚至是找出我的解密失败原因的正确途径吗?感谢您提供任何可以指出我的信息或方向。

布赖恩

0 投票
1 回答
723 浏览

c - 将 gcrypt MD5 输出与现有哈希进行比较

我得到了一个 MD5 输出(一个 16 字节的十六进制字符串),我需要弄清楚用于生成散列的消息是什么。

我想将它与 gcrypts 的输出进行比较gcry_md_hash_buffer(),但我确定如何以一种strcmp()知道两者相同的方式声明它。

我之前试过这个:

但是当我尝试 printf() 时,这最终吃掉了不同字符串的一部分

问题区域示例:

编辑:我认为我没有正确解释这一点。让我们再试一次。

教授有一条秘密消息,并给了我们它的 MD5 哈希输出。他希望我们编写一个程序来通过蛮力找到原始消息。

该消息有 11 个字符长,但他已经告诉我们其中 5 个字符是什么。从这里,我猜到了秘密信息,但我仍然要编写程序。:(

我已经让 MD5 部分工作了,但我需要弄清楚如何将我从 MD5 中获得的输出与他给我们的 MD5 进行对比。

换句话说,我需要声明一个变量,以便它包含 profs 哈希,并且可以与我从 gcry_md_hash_buffer() 获得的输出进行比较(通过 strcmp() 或 memcmp(),我并不挑剔)。

编辑2:

安托万明白了。memcmp() 可以解决问题!非常感谢!

0 投票
0 回答
83 浏览

c - 生成密码时出错

我正在使用 PBKDF2 从使用 SHA-256 的密码生成密钥

我有以下问题:

  1. 我的函数总是打印“从密码生成密钥时出错”,但是当我打印错误消息时,它会打印成功。为什么我在生成密码时出错?

  2. 我不知道应该有的价值keysize。谁能解释我需要在该参数中添加什么?

  3. 当我运行此代码时,我在行出现分段错误gcry_kdf_derive。为什么会这样?

谢谢。

0 投票
1 回答
121 浏览

c - 有没有办法将 4 字节数表示为 16 字节数?

必须使用 4 字节 IV 加密一些数据。但是,我使用的加密算法(AES128)需要一个 16 字节(128 位)的密钥。说,我的代码如下:

keyBuffer包含一个 16 字节的密钥bytes,和输出分别是我的输入和输出。我该如何正确地进行静脉注射?

0 投票
1 回答
1726 浏览

c - aes-gcm 在 C 中使用 libgcrypt api

我正在使用 libgcrypt(Gentoo x64 上的 v1.6.1)并且我已经实现(并通过 AE 测试向量进行了测试)aes256-cbc 和 aes256-ctr。现在我正在查看 aes256-gcm 但我对工作流程有些怀疑。下面是一个简单的加密程序的骨架:

在 GCM 模式下,还需要这些指令:

所以加密程序的正确工作流程是:

但我没有明白的是:

  1. abuf就像盐一样?(所以我必须使用gcry_create_nonce或类似方法生成它吗?)
  2. 如果我想加密一个文件,void *tag我必须写入输出文件吗?