问题标签 [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.
encryption - 在 openssl 中使用 EVP_aes_128_gcm 用于大小不是 16 的倍数的广告
我正在尝试使用 openssl EVP (EVP_aes_128_gcm) 作为 GMAC 的接口。我正在针对 NIST 的 CAVP GCM 测试向量(http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip)测试代码。问题是:当广告大小是 16 的倍数时,代码可以给出正确的 GMAC 标签。但如果大小不是 16 的倍数,则结果是错误的。可能是什么问题呢?
代码是:
对于测试向量(代码中的注释部分):
输出错误...
对于测试向量:
输出是正确的:
我使用的版本是:OpenSSL 1.0.1 14 Mar 2012
java - AES-GCM:AEADBadTagException:GCM 中的 mac 检查失败
在第一次尝试实现 AES-GCM 时,我们面临生成 AuthenticationTag、加密密码和 GCM mac 检查最终失败的问题。对于当前的实现tag[]
正在填充,但byte[] encrypted
仍然为空。并因此cipher.doFinal(data1, offset)
给出了' mac check in GCM failed
'。字节数组的大小似乎存在一些问题,有人可以分享在什么基础上确定输出缓冲区大小吗?这应该分块完成吗?
任何指向 AES-GCM 实现的指针/链接都将受到高度赞赏。
以下是我们的实现:
它给出了以下异常:
提前致谢!!
java - 使用openssl解密用java加密的aes-gcm
我在Java中有以下代码:
样本输出:
我将 Base64 输出复制到一个文件(测试输入)中,并尝试使用以下命令对其进行解密:
我收到一条bad decrypt
错误消息(退出代码:1)。尝试不同的模式(id-aes192-GCM 和 id-aes256-GCM)结果相同。
我做错了什么?
c - EVP_DecryptFinal_ex 中用于解密的最终块的正确格式是什么?
为了学习目的,我实现了一个简单的 AES-256-GCM 加密和解密。在测试我的代码时,如果我输入长度为 6 的倍数的字符串,那么我会得到正确的输出,但在其他情况下,解密的数据会附加一些垃圾字符。
现在我在https://www.openssl.org/docs/crypto/EVP_EncryptFinal_ex.html上读到
但是由于在这种情况下默认启用填充,我猜测问题出在最终块的正确格式上。我在下面附上了我的代码:
java - 解密 TLS 1.2 AES-GCM 数据包
我正在开发一个 Java 程序来解密使用密码的TLS 1.2会话TLS_RSA_WITH_AES_128_GCM_SHA256
。我使用wireshark录制了一个测试会话。大师的秘密是众所周知的。
Packet 11
包含HTTP GET Request
我正在尝试解密的内容。
握手数据:
包 11 数据:
到目前为止我做了什么:
密钥推导:
我这里只需要客户端密钥,因为我想解密一个客户端->服务器包。我根据 RFC 扩展了服务器和客户端密钥以及 IV。
Client Write Key: 4B119DFBFC930ABE130030BD53C3BF78
Client Write IV: 2029CAE2
随机数:
我从 salt(=Client Write IV)和显式 nonce(=加密数据的前 8 个字节)创建 AES-GCM nonce。
Salt: 2029CAE2
explicitNonce: C91DE005E2AE50A8
Nonce: 2029CAE2C91DE005E2AE50A8
附加身份验证数据 (AAD):
这就是我显然被卡住的地方。RFC5246 说:
附加数据 = seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length;其中“+”表示串联。
所以我做了这个:
我认为seq_no
是 1。发送记录时,它会重置为零Change Cipher Spec
。( Packet #8
) 那么加密Finished
记录就有了seq_no = 0
。下一个客户端数据包是我们的Packet #11
with seq_no = 1
。
代码:
现在我将所有东西都输入 BouncyCastle:
这总是抛出MAC failed: mac check in GCM failed。但是解密的输出是正确的:
这打印GET / HTTP/1.0\n
。
解压助手:
结论: 由于解密后的输出是正确的,我可以放心地假设密钥派生和解密工作正常。只有认证失败。所以我想也许我在附加身份验证数据 (AAD) 上做错了。所以这个问题归结为:
如何正确组装附加身份验证数据 (AAD)?
谢谢!
c++ - AES、128 和 256 无效密钥长度
我正在尝试使用 Crypto++ 加密文本。上次使用 AES CTR 时效果很好,但现在使用 CBC 或 GCM 时,我可以使用的最大密钥长度是 32 位?
处理加密的代码:
运行此 Crypto++ 时会抛出Exception
:
请注意,使用 Wiki 中提供的 example.zip 时会发生同样的事情(并将密钥长度更改为 256 或 128)
任何想法为什么Exception
被抛出?
php - AES-256-GCM 模式解密在 php 中失败
这是我的代码:
我得到了加密的消息,但解密没有给出任何结果或错误消息。相同的代码正在使用另一种方法,例如 aes-256-cbc。
c - AES-CBC + HMAC 和 AES-GCM 之间的极端时间差异
所以我一直在广泛地寻找 CBC 和 GCM 的不同 AES 实现,我不想自己实现这个,以防我出错,所以我找到了以下 AES CBC 代码并在我的 RX63NB 上测试了它们的速度(瑞萨测试板)。
我对 Cyclone 的速度有多快感到惊讶,为了澄清我从CycloneSSL 获取了 AES、CBC 和 Endian 文件并且只使用了这些文件。
然后我尝试了 CycloneSSl 的 GCM,这是输出:
我检查了 HMAC 时间(来自 CycloneSSL),看看需要多少时间:
其中最慢的是漩涡。
如果您将 128 字节的 cbc 加密时间添加到带有 128 字节的漩涡的 hmac 中,您将获得 6795 μs,这大约是 GCM 所需时间的一半。
现在我可以理解,由于 galios 字段等原因,GHASH 比 HMAC 需要更长的时间,但与我知道的最慢的 HASH 算法相比,它的速度要慢 2 倍,这太疯狂了。
所以我开始怀疑我是否做错了什么,或者 CycloneSLL gcm 的实现是否真的很明显。不幸的是,我还没有在 c 中找到其他易于使用的 GCM 实现来与之进行比较。
我使用的所有代码都可以在 pastebin上找到,不同的文件用 -------------------- 分隔
这是我用来用 GCM 加密的代码:
out[] 中的数据是来自 in[] 的 gcm 加密数据,并且一切正常。(正确解密并通过身份验证。
问题
- 所有 GCM 实现都这么慢吗?
- 还有其他(更好的)GCM 实现吗?
- 如果我想要快速加密+验证,我应该只使用 HMAC 吗?
编辑
我已经能够从mbedTLS (PolarSSL)获得 GCM 方法,它比旋风分离器快 11 倍(加密/解密 128 个字节需要 880us)。它产生与 cylcone GCM 相同的输出,所以我相信它可以正常工作。