问题标签 [aes-gcm]

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 投票
2 回答
3538 浏览

java - Checking tag and associated data in an AEAD cipher in Java

I need to use AEAD to share information between two users, part of which must be encrypted and part of which should be kept in cleartext.

Is there an API to check the ciphertext tag and access the associated data once a message has been encrypted with AES/GCM ?

In more detail:

I'm using Java 7 with bouncycastle as a provider and I have managed to encrypt and decrypt my data successfully, using the corresponding API:

However, it is my understanding that AES/GCM ciphertexts should already contain the parameters that could affect decryption (nonce and associatedData). Therefore, I would like to be able to retrieve them from the ciphertext, rather than having to store them alongside the ciphertext and pass them along to the decryption function. Furthermore, I'd like to be able to run integrity checks (computing the tag) and run some checks on the associated data without having to completely decrypt the message.

Is there an API that would allow this and that I might have missed ?

So far, I've checked:

0 投票
0 回答
352 浏览

c - 使用 rfc3686(ctr(aes)) 解密而不使用 Linux 内核中的 AES-NI 指令

我试图弄清楚 AES-NI 给 AES 加密操作带来的不同。正如英特尔所说,在尝试使用 AES-CBC 之后,它似乎没有成功。然而,对于 AES-CTR 和 AES-GCM 模式,英特尔承诺会大幅提升性能。我正在尝试使用 rfc3686(ctr(aes)) 加密算法来解密 ESP 数据包,但没有成功。这是我的加密 API 代码片段-

// 这里是decrypt_callback

现在,在数据包处理过程中,我看到crypto_ablkcipher_decrypt返回 0,但没有调用decrypt_callback 。

另外,我在 AES-NI rfc3686(ctr(aes))解密路由中放了一些打印,我看不到这些打印,当放入 AES-CBC 解密和使用 AES-CBC 算法时是可见的。

请指教可能出了什么问题。

谢谢

0 投票
1 回答
5277 浏览

java - 在 Java 中使用 BouncyCastle 读取 AES/GCM 编码数据块

我试图弄清楚如何读取用 AES/GCM/NoPadding 编码的数据。我正在使用的数据将任意大,我希望分块阅读它,但我很难弄清楚如何完成。这是我现在所处位置的示例:

请注意,我通过第一个断言没有问题,因此可以一次性解码数据。此外,接下来的两组断言(解码 16 字节块中的前 32 个字节)“正确”工作,但我通过反复试验得出了这个公式。他们有一些我不明白的地方:

  • 即使我正在阅读 16 字节的块,我的所有数字似乎都需要是 32 的倍数。如果我更改为以下代码,那么对 cipher.update() 的第一次调用将失败,返回值为 0。

    /li>
  • 如果我在输入端改回 32,但我使用 16 字节的输出缓冲区,那么第一次调用会成功并返回预期的数据,但对 cipher.update() 的第二次调用会引发 ArrayIndexOutOfBoundsException。

    /li>
  • 因此,如果我将代码改回原来的示例(decryptedChunk 大小为 32 字节),那么对 cipher.update() 的第三次调用返回值 16(意味着什么???),并且 decryptedChunk 包含垃圾数据。

  • 我还尝试用对 cipher.doFinal() 的调用代替对 cipher.update() 的最后调用:

    /li>

但这会因 BadPaddingException 而失败(GCM 中的 mac 检查失败)。

有什么建议么?


更新解决方案

在使用了 Ebbe M. Pedersen 的建议代码后,我已经能够整理出以下解决方案:

这适用于chunkSize我选择的任何值。我已将该答案标记为已接受。谢谢大家的帮助。

0 投票
3 回答
4014 浏览

php - 我们如何在 PHP 中使用 GCM 模式加密?

我已经阅读了很多关于GCM的内容以及它有多棒,我想知道如何使用PHP使用AES-GCM身份验证加密。支持吗?我在 Codeigniter 框架文档中发现了一些对GCM的引用,这让我相信它可以在Codeigniter中使用。mcrypt()

我还在一篇关于Zend的文档中发现了一些东西。我不打算使用Codeigniter驱动程序,因为我不使用任何框架,也不打算用于我当前的项目。然而,在我看来,如果Codeigniter能够做到这一点,那么我们应该能够在没有框架的情况下做到这一点。

似乎GCM是兼顾安全性和性能的方式(我看到了非常令人印象深刻的性能数据)。我的感觉是我们需要这个,但我找不到任何例子。必须有人知道如何实现这一点。我知道OpenSSL支持它。

任何帮助将不胜感激。

0 投票
2 回答
3955 浏览

ruby - Ruby - 不支持的密码算法 (AES-256-GCM)

我收到错误:

不支持的密码算法 (AES-256-GCM) (RuntimeError)

但我似乎有所有的要求:

红宝石版本:

$红宝石--版本

红宝石 2.1.2p95

OpenSSL 确实列出了 gcm:

$ openssl enc -help 2>&1 | grep gcm

-aes-128-ecb -aes-128-gcm -aes-128-ofb
-aes-192-ecb -aes-192-gcm -aes-192-ofb
-aes-256-ecb -aes-256-gcm -aes -256-ofb

红宝石解释器:

$ irb

2.1.2 :001 > 需要“openssl”;放 OpenSSL::VERSION

1.1.0

=> 无

2.1.2 :002 > OpenSSL::Cipher.ciphers.include?“aes-128-gcm”

=> 真

但是我在运行此代码时遇到错误:

如何让 GCM 在 ruby​​ 中工作?

0 投票
1 回答
1031 浏览

c - Openssl AES GCM-256 Htables

我想为我的学期项目重新实施一篇关于 s-box 的研究论文,但我现在时间不多。我的职责是用不同的 sbox 测试不同的 aes 模式(如 cbc、ecb、ctr、gcm)。我为此目的使用 openssl 库 1.0.1i。显然我需要生成查找表,为此这篇文章很有帮助

生成 AES (AES-256) 查找表

现在我必须嵌入这些表。我浏览了 openssl 库,发现 aes_core.c 具有所有查找表和 crypto_cbc128_encrypt() 使用的有用函数以及 aes/... 中的其他模式源文件...编译成功但对于 GCM_AES_256 我被卡住了。我无法找到像 aes_cbc、aes_ctr 等 GCM_aes_256 源文件。它的实现方式不同吗?由于 aes 在所有模式中都使用,因此最终应该从 aes_core 文件中使用相同的查找表。不是这样吗?它在openssl中的实现方式不同吗?

在 Openssl 文件中,我在 gcm_128 中看到了 Htables。这些表有什么作用?他们是否指向与 aescore 中相同的查找表?

0 投票
3 回答
14219 浏览

cryptography - 使用 Java 8u20 进行慢速 AES GCM 加密和解密

我正在尝试使用 AES/GCM/NoPadding 加密和解密数据。我安装了 JCE Unlimited Strength Policy Files 并运行了下面的(简单的)基准测试。我使用 OpenSSL 完成了相同的操作,并且能够在我的 PC 上实现超过1 GB/s 的加密和解密。

通过下面的基准测试,我只能在同一台 PC 上使用 Java 8获得3 MB/s 的加密和解密。知道我做错了什么吗?

编辑: 我把它作为一个有趣的练习来改进这个简单的基准。

我已经使用 ServerVM 进行了更多测试,删除了 nanoTime 调用并引入了预热,但正如我预期的那样,这些都没有对基准测试结果有任何改进。它是扁平的,每秒3兆字节。

0 投票
1 回答
1539 浏览

authentication - OpenSSL 是否有 GMAC API 和示例

我正在做一个需要对大量数据进行身份验证的项目。似乎 GMAC 是为高吞吐量操作而设计的。我只需要消息验证码,不需要加密。OpenSSL 是否具有仅计算 GMAC 代码的 GMAC API 或示例?

我知道 GCM 用于加密和身份验证,但对于我的情况,不需要加密。有没有仅使用 openssl 进行 GMAC 计算的示例?

0 投票
1 回答
501 浏览

ios - 解密数据,在IOS中使用带有openssl evp接口的aes gcm

我有以下用于解密数据的代码:

由于某种原因,代码无法正确解密数据。_sesKey 是正确的,并且在调用 toIV 以强制第一组数据使用正确的 iv 之后,IV 被覆盖,并且解密不需要 AAD 数据。我已经在 android 中完成了这个(使用 bouncycastle 库),所以我知道 _sesKey 和 IV 是正确的。我不知道是否有人可以通过告诉我出了什么问题以及为什么来帮助我。

0 投票
3 回答
7222 浏览

java - 为什么将 GCM 身份验证标签放在密码流的末尾需要在解密期间进行内部缓冲?

在 Java 中,“默认”AES/GCM 提供程序 SunJCE 将 - 在解密过程中 - 在内部缓冲 1)用作输入的加密字节或 2)作为结果生成的解密字节。执行解密的应用程序代码会注意到Cipher.update(byte[])返回一个空字节数组并Cipher.update(ByteBuffer, ByteBuffer)返回写入长度 0。然后当过程完成时,Cipher.doFinal()将返回所有解码的字节。

第一个问题是:上面的数字 1 或数字 2 正在缓冲哪些字节?

我假设缓冲只发生在解密期间而不是加密期间,因为首先,这种缓冲产生的问题(简短描述)不会发生在我的 Java 客户端对从磁盘读取的文件进行加密时,它总是发生在服务器端,接收这些文件并进行解密。其次,这里是这么说。仅根据我自己的经验判断,我无法确定,因为我的客户使用CipherOutputStream. 客户端没有显式使用 Cipher 实例上的方法。因此我无法推断是否使用了内部缓冲,因为我看不到 update- 和 final 方法返回什么。

当我从客户端传输到服务器的加密文件变大时,我的真正问题就出现了。大我的意思是超过 100 MB。

然后发生的是 Cipher.update() 抛出一个OutOfMemoryError. 显然是由于内部缓冲区越来越大。

此外,尽管有内部缓冲并且没有从 Cipher.update() 接收到结果字节,但Cipher.getOutputSize(int) 会持续报告不断增长的目标缓冲区长度。因此,我的应用程序代码被迫分配一个不断增长ByteBuffer的输入 Cipher.update(ByteBuffer, ByteBuffer)。如果我尝试作弊并传入容量较小的字节缓冲区,则更新方法会抛出#1。知道我创建了无用的巨大字节缓冲区是非常令人沮丧的。ShortBufferException

鉴于内部缓冲是万恶之源,那么我在这里应用的明显解决方案是将文件分成块,每个块 1 MB - 我发送小文件从来没有问题,只有大文件。但是,我很难理解为什么首先会发生内部缓冲。

先前链接的SO 答案说 GCM:s 身份验证标签“添加在密文的末尾”,但它“不必放在末尾”,这种做法“搞乱了 GCM 的在线性质”解密”。

为什么将标签放在最后只会弄乱服务器的解密工作?

这就是我的推理方式。为了计算身份验证标签或 MAC(如果您愿意),客户端使用某种散列函数。显然,MessageDigest.update()不使用不断增长的内部缓冲区。

那么在接收端,服务器不能做同样的事情吗?首先,他可以解密字节,尽管是未经身份验证的字节,将它们输入哈希算法的更新函数,当标签到达时,完成摘要并验证客户端发送的 MAC。

我不是一个加密人,所以请跟我说话,就好像我既愚蠢又疯狂,但足够爱关心一些人=)我衷心感谢您花时间阅读这个问题,甚至可能会有所启发!

更新#1

我不使用 AD(关联数据)。

更新#2

编写的软件演示了使用 Java 的 AES/GCM 加密,以及 Java EE 中的安全远程协议(SRP) 和二进制文件传输。前端客户端是用 JavaFX 编写的,可用于动态更改加密配置或使用块发送文件。在文件传输结束时,会显示一些有关传输文件所用时间和服务器解密时间的统计信息。该存储库还有一个文档,其中包含我自己的一些 GCM 和 Java 相关研究。

享受:https ://github.com/MartinanderssonDotcom/secure-login-file-transfer/


#1

有趣的是,如果进行解密的服务器自己不处理密码,而是使用 a CipherInputStream,则不会抛出 OutOfMemoryError 。相反,客户端设法通过线路传输所有字节,但在解密期间的某个地方,请求线程无限期挂起,我可以看到一个 Java 线程(可能是同一个线程)充分利用了 CPU 内核,同时保持文件打开磁盘不可访问并且报告的文件大小为 0。然后在很长一段时间后,Closeable源被关闭,我的 catch 子句设法捕获由以下原因引起的 IOException:“javax.crypto.AEADBadTagException:输入太短 - 需要标签” .

使这种情况变得奇怪的是,传输较小的文件可以使用完全相同的代码完美地工作 - 因此显然可以正确验证标签。问题的根本原因必须与显式使用密码时相同,即不断增长的内部缓冲区。我无法在服务器上跟踪成功读取/解密了多少字节,因为一旦开始读取密码输入流,编译器重新排序或其他 JIT 优化就会使我所有的日志记录语句化为乌有。他们[显然]根本没有被执行。

请注意,这个 GitHub 项目及其相关的博客文章说 CipherInputStream 已损坏。但是当我使用 Java 8u25 和 SunJCE 提供程序时,这个项目提供的测试对我来说并没有失败。正如已经说过的,只要我使用小文件,一切都对我有用。